Unity 循环列表 EnhancedScroller

1.界面搭建

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.代码编写

添加脚本,单元格数据模型。M。

public class CellData
{
    
    
    public int id;
    public string title;
    public string content;
}

添加脚本,单元格显示设置。V。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using EnhancedUI.EnhancedScroller;
using UnityEngine.UI;

public delegate void OnClickCellDelegate(int id);

public class CellView : EnhancedScrollerCellView
{
    
    
    private CellData _data;
    public Text _text;

    public OnClickCellDelegate onClickCellDelegate;

    public void SetData(CellData data)
    {
    
    
        _data = data;
        _text.text = data.title;
    }

    public void Cell_OnClick()
    {
    
    
        onClickCellDelegate?.Invoke(_data.id);
    }
}

添加脚本,滚动条管理器。C。

using System.Collections.Generic;
using UnityEngine;
using EnhancedUI.EnhancedScroller;
using UnityEngine.UI;

public class ScrollerManager : MonoBehaviour, IEnhancedScrollerDelegate 
{
    
    
    public EnhancedScroller m_Scroller;
    public CellView m_Cell;
    public Text m_Content;
    //public RectTransform m_RectTransform;

    private List<CellData> _data;

    void Start()
    {
    
    
        InitData();

        m_Scroller.Delegate = this;
        m_Scroller.ReloadData();
    }

    private void InitData()
    {
    
    
        _data = new List<CellData>();
        for (int i = 0; i < 100; i++)
        {
    
    
            _data.Add(new CellData()
            {
    
    
                id = i,
                title = "aaa-" + i.ToString(),
                content = "id:" + i.ToString()
            });
        }
    }

    public int GetNumberOfCells(EnhancedScroller scroller)
    {
    
    
        return _data.Count;
    }

    public float GetCellViewSize(EnhancedScroller scroller, int dataIndex)
    {
    
    
        return m_Cell.gameObject.GetComponent<RectTransform>().sizeDelta.y;
    }

    public EnhancedScrollerCellView GetCellView(EnhancedScroller scroller, int dataIndex, int cellIndex)
    {
    
    
        //创建一个单元格视图,或回收一个已经存在的单元格视图,参数为用于创建单元格视图的预制构件
        CellView cellView = scroller.GetCellView(m_Cell) as CellView;
        //将预制体显示
        cellView.gameObject.SetActive(true);
        //单元格的点击事件
        cellView.onClickCellDelegate = OnClickCell;
        //设置单元格的数据
        cellView.SetData(_data[dataIndex]);

        return cellView;
    }

    private void OnClickCell(int id)
    {
    
    
        m_Content.text = _data[id].content;
    }
}

3.API

3.1 EnhancedScrollerCellView 单元格

属性:
cellIdentifier — 单元格的标识符,在面板设置
int cellIndex — cell在cell view中的索引,如果列表是循环的,这将不同于dataIndex
int dataIndex — 在cellview中的索引位置
bool active — 单元格是存活(true)还是已回收

3.2 EnhancedScroller 列表滚动控制

回调:
cellViewWillRecycle(cellView) – cellView 被回收时触发
cellViewVisibilityChanged(cellView) – cellView显示发生改变时触发
scrollerScrolled(this, val, _scrollPosition) – 当滚动矩形滚动时,将调用此委托
…(查看EnhancedScroller.cs)

private void ResigerBtnEvent()
    {
    
    
        //跳转
        Btn_Top.onClick.AddListener(() => m_Scroller.JumpToDataIndex(0, 0, 0, true, EnhancedScroller.TweenType.easeOutQuint, 1.0f, ()=>Debug.Log("滚到顶部完成")));
        Btn_Bottom.onClick.AddListener(() => m_Scroller.JumpToDataIndex(_data.Count - 1, 0, 0, true, EnhancedScroller.TweenType.easeOutQuint, 1.0f, ()=>Debug.Log("滚到底部完成")));
        //刷新全部数据
        Btn_ReloadAll_1.onClick.AddListener(() => HandlerBtnReloadAll_1());
        Btn_ReloadAll_2.onClick.AddListener(() => HandlerBtnReloadAll_2());
    }

    //刷新全部数据,停留在当前位置
    private void HandlerBtnReloadAll_1()
    {
    
    
        _data.Clear();
        for(int i=1; i<50; i++)
        {
    
    
            _data.Add(new CellData()
            {
    
    
                id = i,
                title = "aaa-" + (i + 100).ToString(),
                content = "id:" + (i + 100).ToString()
            });
        }

        //m_Scroller.
        var scrollPosition = m_Scroller.ScrollPosition;
        m_Scroller.ReloadData();
        m_Scroller.ScrollPosition = scrollPosition;
    }

    //刷新全部数据,位置重头开始/位置到尾部
    private void HandlerBtnReloadAll_2()
    {
    
    
        _data.Clear();
        for(int i=1; i<50; i++)
        {
    
    
            _data.Add(new CellData()
            {
    
    
                id = i,
                title = "aaa-" + (i + 100).ToString(),
                content = "id:" + (i + 100).ToString()
            });
        }

        m_Scroller.ReloadData();    //刷新后停留在 头部, 默认是 0
        //m_Scroller.ReloadData(1);    //刷新后停留在 尾部, 默认是 0
    }

4.运行结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45136016/article/details/125995419