using System; using System.Collections.Generic; using UnityEngine; namespace GameLogic { /// /// UI列表。 /// public class UILoopGridWidget : UIListBase where TItem : UILoopGridItemWidget, new() { /// /// LoopRectView /// public LoopGridView LoopRectView { private set; get; } /// /// Item字典 /// private Dictionary m_itemCache = new Dictionary(); /// /// 计算偏差后的ItemList /// private List m_items = new List(); /// /// 计算偏差后的ItemList /// public List items => m_items; public override void BindMemberProperty() { base.BindMemberProperty(); LoopRectView = rectTransform.GetComponent(); } public override void OnCreate() { base.OnCreate(); LoopRectView.InitGridView(0, OnGetItemByIndex); } public override void OnDestroy() { base.OnDestroy(); m_itemCache.Clear(); } /// /// Item回调函数 /// protected Action m_tpFuncItem; /// /// 设置显示数据 /// /// /// /// protected override void AdjustItemNum(int n, List datas = null, Action funcItem = null) { base.AdjustItemNum(n, datas, funcItem); m_tpFuncItem = funcItem; LoopRectView.SetListItemCount(n); LoopRectView.RefreshAllShownItem(); m_tpFuncItem = null; } /// /// 获取Item /// /// /// /// /// /// protected LoopGridViewItem OnGetItemByIndex(LoopGridView listView, int itemIndex,int row,int column) { if (itemIndex < 0 || itemIndex >= num) return null; var item = itemBase == null ? CreateItem() : CreateItem(itemBase); if (item == null) return null; item.SetItemIndex(itemIndex); UpdateListItem(item, itemIndex, m_tpFuncItem); return item.LoopItem; } /// /// 创建Item /// /// public TItem CreateItem() { return CreateItem(typeof(TItem).Name); } /// /// 创建Item /// /// /// public TItem CreateItem(string itemName) { TItem widget = null; LoopGridViewItem item = LoopRectView.AllocOrNewListViewItem(itemName); if (item != null) { widget = CreateItem(item); } return widget; } /// /// 创建Item /// /// /// public TItem CreateItem(GameObject prefab) { TItem widget = null; LoopGridViewItem item = LoopRectView.AllocOrNewListViewItem(prefab); if (item != null) { widget = CreateItem(item); } return widget; } /// /// 创建Item /// /// /// private TItem CreateItem(LoopGridViewItem item) { TItem widget; if (!m_itemCache.TryGetValue(item.GoId, out widget)) { widget = CreateWidget(item.gameObject); widget.LoopItem = item; m_itemCache.Add(item.GoId, widget); } return widget; } /// /// 获取item /// /// /// public override TItem GetItem(int i) { return i >= 0 && i < m_items.Count ? m_items[i] : null; } /// /// 获取itemList /// /// public List GetItemList() { m_items.Clear(); for (int i = 0; i < m_itemCache.Count; i++) { m_items.Add(m_itemCache[i]); } return m_items; } } }