Unity实现首字母检索器

本文实例为大家分享了Unity实现首字母检索器的具体代码,供大家参考,具体内容如下

需要实现一个类似 “城市选择器”的功能 网上基本都是用原生或者前端来实现功能 其他大概的思路都差不多 这里提供一个Unity 实现的思路

先看一下效果

这里用到了 SuperScrollView 这个插件 来实现功能

ListText.cs  // 核心控制类  代码写的比较随意 大概的功能已经实现,需要根据实际需要进行优化。

using SuperScrollView;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class ListText : MonoBehaviour
{
 public LoopListView2 mLoopListView;
 public Text Select_Text;
 public RectTransform Right_Content;
 public GameObject Tag_Prefab;
 public string[] Tags = new string[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "#" };

 public int TreeViewItemCount
 {
 get
 {
 return mItemDataList.Count;
 }
 }
 // Start is called before the first frame update
 void Start()
 {
 Init();

 Keys.Clear();
 for (int i = 0; i < Tags.Length; ++i)
 {
 CityData cityData = new CityData();
 cityData.Key = Tags[i];
 List<string> value = new List<string>();
 value.Add("Item" + Tags[i] + Random.Range(0, 6).ToString());
 cityData.Value = value;

 Keys.Add(cityData);
 }
 DoRefreshDataSource();
 int count = TreeViewItemCount;
 //tells mTreeItemCountMgr there are how many TreeItems and every TreeItem has how many ChildItems.
 for (int i = 0; i < count; ++i)
 {
 int childCount = GetItemDataByIndex(i).ChildCount;
 //second param "true" tells mTreeItemCountMgr this TreeItem is in expand status, that is to say all its children are showing.
 AddTreeItem(childCount, true);
 }

 mLoopListView.InitListView(GetTotalItemAndChildCount(), OnGetItemByIndex);
 }

 public void AddTreeItem(int count, bool isExpand)
 {
 KeyData data = new KeyData();
 data.mTreeItemIndex = mTreeItemDataList.Count;
 data.mChildCount = count;
 data.mIsExpand = isExpand;
 mTreeItemDataList.Add(data);
 mIsDirty = true;
 }
 public int GetTotalItemAndChildCount()
 {
 int count = mTreeItemDataList.Count;
 if (count == 0)
 {
 return 0;
 }
 UpdateAllTreeItemDataIndex();
 return mTreeItemDataList[count - 1].mEndIndex + 1;
 }
 LoopListViewItem2 OnGetItemByIndex(LoopListView2 listView, int index)
 {
 if (index < 0)
 {
 return null;
 }

 KeyData countData = QueryTreeItemByTotalIndex(index);
 if (countData == null)
 {
 return null;
 }
 int treeItemIndex = countData.mTreeItemIndex;
 ValueData treeViewItemData = GetItemDataByIndex(treeItemIndex);
 if (countData.IsChild(index) == false)// if is a TreeItem
 {
 //get a new TreeItem
 LoopListViewItem2 item = listView.NewListViewItem("KeyItem");
 KeyItem itemScript = item.GetComponent<KeyItem>();
 if (item.IsInitHandlerCalled == false)
 {
 item.IsInitHandlerCalled = true;
 itemScript.Init();
 //itemScript.SetClickCallBack(this.OnExpandClicked);
 }
 //update the TreeItem's content
 itemScript.mText.text = treeViewItemData.mName;
 itemScript.SetItemData(treeItemIndex, countData.mIsExpand);
 return item;
 }
 else // if is a TreeChildItem
 {
 //childIndex is from 0 to ChildCount.
 //for example, TreeChildItem0_0 is the 0'th child of TreeItem0
 //and TreeChildItem1_2 is the 2'th child of TreeItem1
 int childIndex = countData.GetChildIndex(index);
 ItemData itemData = treeViewItemData.GetChild(childIndex);
 if (itemData == null)
 {
 return null;
 }
 //get a new TreeChildItem
 LoopListViewItem2 item = listView.NewListViewItem("ValueItem");
 ValueItem itemScript = item.GetComponent<ValueItem>();
 if (item.IsInitHandlerCalled == false)
 {
 item.IsInitHandlerCalled = true;
 itemScript.Init();
 }
 //update the TreeChildItem's content
 itemScript.SetItemData(itemData, treeItemIndex, childIndex);
 return item;
 }

 }

 List<ValueData> mItemDataList = new List<ValueData>();

 int mTreeViewItemCount = 20;
 int mTreeViewChildItemCount = 30;

 // List<string, List<string>> keys = new List<string, List<string>>();

 ArrayList Keys = new ArrayList();

 void DoRefreshDataSource()
 {
 mItemDataList.Clear();

 for (int i = 0; i < Keys.Count; i++)
 {
 ValueData tData = new ValueData();
 CityData city = Keys[i] as CityData;
 tData.mName = "" + city.Key;
 mItemDataList.Add(tData);
 // int childCount = Random.Range(0, 6);
 for (int j = 0; j < city.Value.Count; j++)
 {
 ItemData childItemData = new ItemData();
 childItemData.mName = "Item" + city.Value[j] + ":Child" + j;
 childItemData.mDesc = "Item Desc For " + childItemData.mName;
 childItemData.mStarCount = Random.Range(0, 6);
 childItemData.mFileSize = Random.Range(20, 999);
 tData.AddChild(childItemData);
 }
 }
 //for (int i = 0; i < keys.Count; ++i)
 //{
 // ValueData tData = new ValueData();
 // tData.mName = "" + keys[]
 // mItemDataList.Add(tData);
 // int childCount = Random.Range(0, 6);

 //}
 }

 public void AddItem()
 {
 // string key = Tags[Random.Range(0, Tags.Length)];
 // int itemIndex = Random.Range(0, Tags.Length);
 int itemIndex = 0;
 CityData cityData = Keys[itemIndex] as CityData;

 cityData.Value.Add(cityData.Key + "测试");

 Keys[itemIndex] = cityData;

 // int itemIndex = 0;
 int childIndex = 0;

 if (childIndex < 0)
 {
 childIndex = 0;
 }
 KeyData itemCountData = GetTreeItem(itemIndex);
 if (itemCountData == null)
 {
 return;
 }
 AddNewItemChildForTest(itemIndex, childIndex);
 int childCount = itemCountData.mChildCount;
 SetItemChildCount(itemIndex, childCount + 1);
 DoRefreshDataSource();
 mLoopListView.SetListItemCount(GetTotalItemAndChildCount(), false);

 mLoopListView.RefreshAllShownItem();
 }
 public void SetItemChildCount(int treeIndex, int count)
 {
 if (treeIndex < 0 || treeIndex >= mTreeItemDataList.Count)
 {
 return;
 }
 mIsDirty = true;
 KeyData data = mTreeItemDataList[treeIndex];
 data.mChildCount = count;
 }
 public void AddNewItemChildForTest(int itemIndex, int AddToBeforeChildIndex)
 {
 if (itemIndex < 0 || itemIndex >= mItemDataList.Count)
 {
 return;
 }
 ValueData tData = mItemDataList[itemIndex];
 List<ItemData> childItemDataList = tData.mChildItemDataList;
 ItemData childItemData = new ItemData();
 childItemData.mName = "Item" + itemIndex + ":" + AddToBeforeChildIndex;
 childItemData.mDesc = "Item Desc For " + childItemData.mName;
 childItemData.mStarCount = Random.Range(0, 6);
 childItemData.mFileSize = Random.Range(20, 999);
 if (AddToBeforeChildIndex < 0)
 {
 childItemDataList.Insert(0, childItemData);
 }
 else if (AddToBeforeChildIndex >= childItemDataList.Count)
 {
 childItemDataList.Add(childItemData);
 }
 else
 {
 childItemDataList.Insert(AddToBeforeChildIndex, childItemData);
 }

 }

 public ValueData GetItemDataByIndex(int index)
 {
 if (index < 0 || index >= mItemDataList.Count)
 {
 return null;
 }
 return mItemDataList[index];
 }

 List<KeyData> mTreeItemDataList = new List<KeyData>();
 KeyData mLastQueryResult = null;
 bool mIsDirty = true;
 public KeyData QueryTreeItemByTotalIndex(int totalIndex)
 {
 if (totalIndex < 0)
 {
 return null;
 }
 int count = mTreeItemDataList.Count;
 if (count == 0)
 {
 return null;
 }
 UpdateAllTreeItemDataIndex();
 if (mLastQueryResult != null)
 {
 if (mLastQueryResult.mBeginIndex <= totalIndex && mLastQueryResult.mEndIndex >= totalIndex)
 {
 return mLastQueryResult;
 }
 }
 int low = 0;
 int high = count - 1;
 KeyData data = null;
 while (low <= high)
 {
 int mid = (low + high) / 2;
 data = mTreeItemDataList[mid];
 if (data.mBeginIndex <= totalIndex && data.mEndIndex >= totalIndex)
 {
 mLastQueryResult = data;
 return data;
 }
 else if (totalIndex > data.mEndIndex)
 {
 low = mid + 1;
 }
 else
 {
 high = mid - 1;
 }
 }
 return null;
 }
 void UpdateAllTreeItemDataIndex()
 {
 if (mIsDirty == false)
 {
 return;
 }
 mLastQueryResult = null;
 mIsDirty = false;
 int count = mTreeItemDataList.Count;
 if (count == 0)
 {
 return;
 }
 KeyData data0 = mTreeItemDataList[0];
 data0.mBeginIndex = 0;
 data0.mEndIndex = (data0.mIsExpand ? data0.mChildCount : 0);
 int curEnd = data0.mEndIndex;
 for (int i = 1; i < count; ++i)
 {
 KeyData data = mTreeItemDataList[i];
 data.mBeginIndex = curEnd + 1;
 data.mEndIndex = data.mBeginIndex + (data.mIsExpand ? data.mChildCount : 0);
 curEnd = data.mEndIndex;
 }
 }
 public KeyData GetTreeItem(int treeIndex)
 {
 if (treeIndex < 0 || treeIndex >= mTreeItemDataList.Count)
 {
 return null;
 }
 return mTreeItemDataList[treeIndex];
 }
 public void OnJumpBtnClicked(int itemIndex)
 {
 // int itemIndex = 0;
 int childIndex = 0;
 int finalIndex = 0;
 if (childIndex < 0)
 {
 childIndex = 0;
 }
 KeyData itemCountData = GetTreeItem(itemIndex);
 if (itemCountData == null)
 {
 return;
 }
 int childCount = itemCountData.mChildCount;
 if (itemCountData.mIsExpand == false || childCount == 0 || childIndex == 0)
 {
 finalIndex = itemCountData.mBeginIndex;
 }
 else
 {
 if (childIndex > childCount)
 {
 childIndex = childCount;
 }
 if (childIndex < 1)
 {
 childIndex = 1;
 }
 finalIndex = itemCountData.mBeginIndex + childIndex;
 }
 mLoopListView.MovePanelToItemIndex(finalIndex, 0);
 }

 public void Init()
 {
 int Index = 0;
 foreach (string Value in Tags)
 {
 GameObject go = Instantiate(Tag_Prefab, Right_Content);
 go.name = "Tag-" + Value;
 Tag_Item tag_Item = go.GetComponent<Tag_Item>();
 tag_Item.Select_Text = Select_Text;
 tag_Item.Init(Value);
 tag_Item.Index = Index;
 tag_Item.KeyStr = Value;
 tag_Item.listText = this;
 Index += 1;
 }
 }

}

public class CityData
{
 public string Key;
 public List<string> Value;
}

这里提供 源码下载  unity版本2019.4.6 低版本也可以打开

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C#中DataTable排序、检索、合并等操作实例

    一.排序1.获取DataTable的默认视图2.对视图设置排序表达式3.用排序后的视图导出的新DataTable替换就DataTable(Asc升序可省略,多列排序用","隔开)1).重生法 复制代码 代码如下: dstaset.Tables.Add(dt)dataset.Tables(0).DefaultView.Sort = "id desc" 2).直接法 复制代码 代码如下: dv = New DataView(dt)dv.Sort = "id d

  • Unity实现首字母检索器

    本文实例为大家分享了Unity实现首字母检索器的具体代码,供大家参考,具体内容如下 需要实现一个类似 "城市选择器"的功能 网上基本都是用原生或者前端来实现功能 其他大概的思路都差不多 这里提供一个Unity 实现的思路 先看一下效果 这里用到了 SuperScrollView 这个插件 来实现功能 ListText.cs  // 核心控制类  代码写的比较随意 大概的功能已经实现,需要根据实际需要进行优化. using SuperScrollView; using System.Co

  • JS实现移动端按首字母检索城市列表附源码下载

    我们常见的手机通讯录或微信通讯录,联系人信息是按字母顺序排列的列表,通过点击右侧的字母,会迅速定位检索到首字母对应的联系人.那么我今天给大家介绍的是按首字母快速定位到城市列表,效果和通讯录一样的.  查看演示 下载源码 准备 查看演示     下载源码 准备 首先我们需要用到全国的城市数据,这些城市数据来源于网络,我已经将数据格式化成JSON形式了,大家可以直接拿去用. 我们还需要用到一个叫better-scroll的滚动插件,它能帮我们将超长的页面原生的滚动条处理掉,优化滚动效果. 接着我们准

  • vue 实现模糊检索并根据其他字符的首字母顺序排列

    昨天让我做一个功能,实现一个模糊检索,我就想,那做呗,然后开始正常的开发 代码如下: HTML VUE 因为是实时的,所以写了将逻辑写到了watch中 五分钟搞定. 我以为这就完了,然而产品的需求是无穷无尽的,敬爱的(我想说啥你懂得)产品经理,看到我做的这么快果断加了一波需求. 产品:我觉得你这里可以加一个排序,根据他的没有非搜索词的其他字符的首字母顺序排列一下.(一口气说的我有点懵 ) 过了3分钟我才明白他的意思,就是根据第二个字的首字母的拼音排序.然后,接着改呗 又是5分钟 搞定,下班. 总

  • asp.net 根据汉字的拼音首字母搜索数据库(附 LINQ 调用方法)

    方法一:先查询出所有记录,然后在逻辑层转化为拼音首字母后查询,显然傻瓜才会这么做. 方法二:在需要搜索的表中添加一个字段用于存放被检索字段内容对应的拼音,在搜索的时候同时去查询这两个字段,这种方法可行,但会增加数据库存放的大小. 方法三:在数据库中建立一个函数,在执行查询语句时通过此函数来转化搜索,函数如下: 复制代码 代码如下: SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ===============================

  • asp.net 汉字转换拼音及首字母实现代码

    Default.aspx页面 复制代码 代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:

  • ASP.NET 根据汉字获取汉字拼音的首字母(含多音字)

    在很多时候,我们需要将汉字的拼音首字母存储到数据库,以便我们能通过首字母进行快速的查询,常见的有百度搜索,你只要输入拼音的首字母,就会出现相关的搜索的关键词,再比如一些办公系统中,查询一个人的姓名,为了简单方便,只输这个人的名字的首字母,就能快速检索. 话不多说,代码分享给大家: #region 获取汉字转换拼音 首字母 public string MkPinyinString(string HanZiStr) //获取汉字字符串的拼音首字母,含多音字 { int i, j, k, m; str

  • PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法

    本文实例讲述了PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法.分享给大家供大家参考,具体如下: ICU(International Components for Unicode)里提供了transliterator(直译器), 可以很方便把其他语言(比如简体中文)转为拉丁文表示: http://cn2.php.net/manual/zh/transliterator.transliterate.php Transliterator: allows getting la

  • C# 获取汉字的拼音首字母

    获取汉字拼音的首字母是一个在做项目的过程中经常需要用到的功能,今天我们主要来探讨下C# 获取汉字的拼音首字母 /// <summary> /// 在指定的字符串列表CnStr中检索符合拼音索引字符串 /// </summary> /// <param name="CnStr">汉字字符串</param> /// <returns>相对应的汉语拼音首字母串</returns> public static string

  • 利用PHP获取汉字首字母并且分组排序详解

    前言 本文主要给大家介绍了关于PHP获取汉字首字母并分组排序的相关内容,因经常我们在做项目的时候,会有按首字母排序的需求 比如: 美团的城市选择 http://www.meituan.com/index/changecity/initiative app中按字母搜索 正题 网上找了各种,不尽人意,于是,自己就写了一个,分享给大家. <?php /** * @author Tech */ class Character { /** * 二维数组根据首字母分组排序 * @param array $d

  • Java编程实现中英混合字符串数组按首字母排序的方法

    本文实例讲述了Java编程实现中英混合字符串数组按首字母排序的方法.分享给大家供大家参考,具体如下: 在Java中对于字符串数组的排序,我们可以使用Arrays.sort(String[])方法很便捷的进行排序.例如: String[] arrays = new String[] { "gyu", "sdf", "zf", "大同", "收到", "地方", "三等分"

随机推荐