/MyGridLayout

unity,gridlayout,item无限循环,无限数据量,支持动态增删数据

Primary LanguageC#

MyGridLayout

unity,gridlayout,item无限循环,无限数据量,支持任意动态增删数据

unity 2021.3.10 测试通过

内含示例以及说明,使用简单方便,仅需两步。

1、首先实现自己的适配器

public class MyAdapter : GridLayoutAdapter<Item>
{

    WeakReference<BattleBagScript> mWeakReference;
    GameObject gridItemUIPrefab;

    public MyAdapter(List<Item> datas, BattleBagScript battleBagScript, GameObject gridItemUIPrefab) : base(datas)
    {
        this.mWeakReference = new WeakReference<BattleBagScript>(battleBagScript);
        this.gridItemUIPrefab = gridItemUIPrefab;
    }

    public override GameObject GetGridItemView(int index, Transform parent)
    {
        return GameObject.Instantiate(gridItemUIPrefab, parent);
    }

    public override void BindView(GameObject gridItemView, int index)
    {
        Item item = this.datas[index];
        gridItemView.GetComponentInChildren<Text>().text = item.itemId + "_" + item.itemName + "_" + item.itemCount; 
        gridItemView.GetComponentInChildren<Image>().sprite = Resources.Load<Sprite>("Images/ItemImage/" + item.imageName);
    }

    public override bool IsNeedAutoSelectState()
    {
        return true;
    }

    public override void OnGridItemClick(GameObject gridItem, int index)
    {
        Debug.Log("OnItemClick " + index);
    }

    public override void OnGridItemSelect(GameObject gridItem, int index)
    {
        Debug.LogWarning("OnSelectGridItem " + index);
        BattleBagScript bbs;
        mWeakReference.TryGetTarget(out bbs);
        if (index >= 0)
        {
            if (bbs != null) Debug.Log("OnGridItemSelect " + index);
        }
        else
        {
            if (bbs != null) Debug.Log("取消选中");
        }
    }
}

2、然后初始化设置给MyGridLayout即可,MyGridLayout无任何继承关系,很干净,具体看MyGridLayout代码,包含注释

[RequireComponent(typeof(ScrollRect))]
public class BattleBagScript : MonoBehaviour
{

    public GameObject gridItemUIPrefab;

    MyGridLayout mMyGridLayout;

    List<Item> datas;

    private void Start()
    {
        
        //初始化自己的数据
        //datas = ...

        MyAdapter myAdapter = new MyAdapter(datas, this, this.gridItemUIPrefab);

        mMyGridLayout = new MyGridLayout(this.gameObject, myAdapter);
    }

    private void Update()
    {
        mMyGridLayout.Update();
    }
    
    public void AddOrReduceData()
    {
        //datas.Insert(...); 可以任意位置增加任意数据量
        //datas.RemoveAt(...); 可以任意位置删除任意数据量
        //datas[x].x = x; 可以任意位置修改任意数据量
        mMyGridLayout.NotifyDatasetChange();
    }

}