首先,说一下使用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 initialization
void 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();刷新一下即可。
显示效果如下: