列表SuperScrollview使用Demo"/>
Unity 超级列表SuperScrollview使用Demo
首先,说一下使用SuperScrollview的基本配置:
创建一个scroll view,然后把横纵滑动条设置可配置的,然后再加上Loop List View2代码,如下:
然后我们创建四个代码类:
1、数据类:
2、数据管理类方便增删查改:
public class StudentInfoMgr
{List<StudentInfo> mItemDataList = new List<StudentInfo>();public StudentInfoMgr() { }public StudentInfoMgr(List<StudentInfo> students){mItemDataList.Clear();mItemDataList = students;}/// <summary>/// 获取数据总数量/// </summary>public int TotalItemCount{get{return mItemDataList.Count;}}/// <summary>/// data数据/// </summary>public List<StudentInfo> MItemDataList{get{return mItemDataList;}set{mItemDataList = value;}}/// <summary>/// 查找指定数据/// </summary>/// <param name="index"></param>/// <returns></returns>public StudentInfo FindInfoByIndex(int index){if (index < 0 || index >= mItemDataList.Count){return null;}return mItemDataList[index];}/// <summary>/// 查找指定数据/// </summary>/// <param name="itemId"></param>/// <returns></returns>public StudentInfo FindInfoById(string itemId){int count = mItemDataList.Count;for (int i = 0; i < count; ++i){if (mItemDataList[i].id == itemId){return mItemDataList[i];}}return null;}/// <summary>/// 添加一组数据/// </summary>/// <param name="itemId"></param>/// <returns></returns>public void AddOrUpdateInfo(StudentInfo item){var student = FindInfoById(item.id);if (student == null){mItemDataList.Add(item);}else{student = item;}}/// <summary>/// 添加多组数据/// </summary>/// <param name="itemId"></param>/// <returns></returns>public void AddOrUpdateInfo(List<StudentInfo> items){if (items.Count<= 0) return;foreach (var info in items){var student = FindInfoById(info.id);if (student == null){mItemDataList.Add(info);}else{student = info;}}}/// <summary>///删除一组数据/// </summary>/// <param name="itemId"></param>/// <returns></returns>public void RemoveInfo(StudentInfo item){var student = FindInfoById(item.id);if (student == null) return;mItemDataList.Remove(student);}/// <summary>///删除一组数据/// </summary>/// <param name="itemId"></param>/// <returns></returns>public void RemoveInfo(string id){var student = FindInfoById(id);if (student == null) return;mItemDataList.Remove(student);}/// <summary>///删除所有数据/// </summary>/// <param name="itemId"></param>/// <returns></returns>public void RemoveInfos(){if (mItemDataList.Count<=0) return;mItemDataList.Clear();}
}
3、单条数据显示类:
public class ItemStudentInfo : MonoBehaviour,IPointerEnterHandler, IPointerExitHandler, IPointerClickHandler
{/// <summary>/// 实现点击事件/// </summary>public Action<ItemStudentInfo> OnClick;/// <summary>/// 实现点击事件/// </summary>public Action<ItemStudentInfo> OnEnter;/// <summary>/// 实现点击事件/// </summary>public Action<ItemStudentInfo> OnExit;private StudentInfo info;private int index;[SerializeField]private RectTransform item;public void Init(StudentInfo info,int index){this.info = info;this.index = index;InitData();}private void InitData(){item.GetChild(0).GetComponent<Text>().text = info.id;item.GetChild(1).GetComponent<Text>().text = info.name;item.GetChild(2).GetComponent<Text>().text = info.age;item.GetChild(3).GetComponent<Text>().text = info.grade;item.GetChild(4).GetComponent<Text>().text = info.score;}void IPointerClickHandler.OnPointerClick(PointerEventData eventData){if(this.gameObject!=null) OnClick(this);}void IPointerEnterHandler.OnPointerEnter(PointerEventData eventData){if (this.gameObject != null) OnEnter(this);}void IPointerExitHandler.OnPointerExit(PointerEventData eventData){if (this.gameObject != null) OnExit(this);}
}
4、整体UI显示类:
public class UI_StudentInfo : MonoBehaviour {public LoopListView2 mLoopListView;public RectTransform Content;private List<StudentInfo> studentInfos = new List<StudentInfo>();private StudentInfoMgr infoMgr;// Use this for initializationvoid Start () {for (int i=0;i<100;i++){StudentInfo student = new StudentInfo{id = (i + 100).ToString(),name = "zhang" + i,age = (i + 1).ToString(),grade = "十一班",score = i.ToString(),};studentInfos.Add(student);}InitListView();}private void InitListView(){infoMgr = new StudentInfoMgr(studentInfos);Debug.Log(infoMgr.TotalItemCount);mLoopListView.InitListView(infoMgr.TotalItemCount, OmGetItemByIndex);mLoopListView.MovePanelToItemIndex(infoMgr.TotalItemCount, 0);}private LoopListViewItem2 OmGetItemByIndex(LoopListView2 loopView, int index){if (index < 0 || index > infoMgr.TotalItemCount){return null;}var info = infoMgr.FindInfoByIndex(index);if (info == null){return null;}/*2018.11以后MonoBehaviour不能 new 直接赋值就可*/// LoopListViewItem2 item = new LoopListViewItem2();var item = loopView.NewListViewItem("Item_SuperPrefab");var itemInfo = item.GetComponent<ItemStudentInfo>();itemInfo.Init(info,index);itemInfo.OnClick += OnClick;itemInfo.OnEnter += OnEnter;itemInfo.OnExit += OnExit;return item;}private void OnClick(ItemStudentInfo item){Debug.Log("点击!!");}private void OnEnter(ItemStudentInfo item){Debug.Log("移入!!");item.GetComponent<Image>().color = Color.clear;}private void OnExit(ItemStudentInfo item){Debug.Log("移出!!");item.GetComponent<Image>().color =new Color(1,1,1,130/255f);}
}
这里基本成了,最核心的代码:
基本原理就是利用对象池,做重复利用。
注意:初始化函数LoopListViewItem2.InitListView(lineLossMgr.TotalCount, OmGetItemByIndex)只能调用一次,如果想重置数据,只需要改变数据管理类中的数据(List<StudentInfo> ),然后LoopListViewItem2中的 loopListView2.RefreshAllShownItem();刷新一下即可。
显示效果如下:
更多推荐
Unity 超级列表SuperScrollview使用Demo
发布评论