//-------∽-★-∽------∽-★-∽--------∽-★-∽布局相关∽-★-∽--------∽-★-∽------∽-★-∽--------// protected void RefreshAllItemLayout() { RectTransform listRect = GetComponent <RectTransform>(); float right = 0; float bottom = 0; for (int i = 0; i < m_itemList.Count; i++) { int index = OffsetItemIndex + i; //可能有偏移,不是从0开始 KListItem item = m_itemList[i]; RectTransform itemRect = item.GetComponent <RectTransform>(); Vector2 pivot = itemRect.pivot; Vector2 position = CalculateItemPosition(index); if (item.Visible) { //可见时才算入尺寸 right = position.x + m_itemSize.x + m_padding.right; bottom = position.y + m_itemSize.y + m_padding.bottom; } position.x = position.x + m_itemSize.x * pivot.x; position.y = position.y + m_itemSize.y * (1 - pivot.y); itemRect.anchoredPosition = new Vector2(position.x, -position.y); if (item.Index != index) { item.Index = index; item.name = GenerateItemName(index); } } listRect.sizeDelta = new Vector2(right, bottom); }
protected void AddItemAt(Type itemType, object data, int index, bool doLayoutImmediately = true) { if (m_isExecutingCoroutine == true) { Log.Error("有尚未执行完毕的协程~~", this); return; } //要改成循环利用 GameObject go = GameObjUtil.Instantiate(m_itemTemplate); go.transform.SetParent(this.transform); go.transform.localScale = Vector3.one; go.transform.localPosition = Vector3.zero; go.SetActive(true); //BuildItem(go); KListItem item = ComponentUtil.EnsureComponent(go, itemType) as KListItem; item.Index = index; item.name = GenerateItemName(index); AddItemEventListener(item); m_itemList.Insert(index, item); item.SetData(data); //设置数据 if (doLayoutImmediately) { RefreshAllItemLayout(); } }
public void Reorders(int[] orderArray, bool doLayoutImmediately = true) { int length = orderArray.Length; int itemsCount = GetItemCount(); if (length > itemsCount) { Log.Error(GetType().ToString() + "无效的重排序列表"); return; } KListItem[] array = new KListItem[length]; for (int i = 0; i < length; ++i) { int oldOrder = orderArray[i]; if (oldOrder < 0 || oldOrder >= length) { Log.Error(GetType().ToString() + "无效的重排序下标"); return; } array[orderArray[i]] = m_itemList[i]; } for (int i = 0; i < length; ++i) { m_itemList[i] = array[i]; } if (doLayoutImmediately == true) { RefreshAllItemLayout(); } }
protected virtual void OnItemClick(KListItem target, PointerEventData evtData) { int oldSelectedIndex = SelectedIndex; KComponentEvent <int, int> .InvokeEvent(m_onItemClick, m_evtId_click, target.Index); KEvtCenter4Lua.AddUIListEvent(m_evtId_click, target.Index); if (target == m_selectedItem) { //已经是当前项 return; } bool isSelectedIndexChanged = (SelectedIndex != oldSelectedIndex); if (isSelectedIndexChanged == true) { //若在_onItemClick事件中修改了KList的SelectedIndex,则不再调用后续事件处理 return; } if (m_selectedItem != null) { m_selectedItem.IsSelected = false; m_selectedItem = null; } m_selectedItem = target; m_selectedItem.IsSelected = true; KComponentEvent <int, int> .InvokeEvent(m_onSelectedIndexChanged, m_evtId_change, SelectedIndex); KEvtCenter4Lua.AddUIListEvent(m_evtId_change, SelectedIndex); }
void AddItemEventListener(KListItem item) { item.onClick.AddListener(OnItemClick); if (onDataChange != null) { item.onDataChange -= onDataChange; item.onDataChange += onDataChange; } }
//后滚一页 void MoveOnePagePrev() { for (int i = 0; i < m_pageItemCount; i++) { KListItem item = m_itemList[m_itemList.Count - 1]; m_itemList.RemoveAt(m_itemList.Count - 1); m_itemList.Insert(i, item); int dataIndex = m_startDataIndex + i; RefreshItem(item, dataIndex); } RefreshAllItemLayout(); }
//前滚一页 void MoveOnePageNext() { for (int i = 0; i < m_pageItemCount; i++) { KListItem item = m_itemList[0]; m_itemList.RemoveAt(0); m_itemList.Add(item); int dataIndex = m_startDataIndex + m_pageItemCount * 2 + i; //跨两页 RefreshItem(item, dataIndex); } RefreshAllItemLayout(); }
//刷新单项信息 void RefreshItem(KListItem item, int dataIndex) { if (dataIndex < m_dataList.Count) { item.Visible = true; item.SetData(m_dataList[dataIndex]); } else { item.Visible = false; } }
void RemoveItem(int index) { if (m_isSupportSingle == false) { Log.Error(GetType().ToString() + " 不支持删除Item~~"); return; } if (index > m_itemList.Count - 1) { // 没有这个序号 return; } KListItem item = m_itemList[index]; m_itemList.RemoveAt(index); RemoveItemEventListener(item); Destroy(item.gameObject); }
void RemoveItemEventListener(KListItem item) { item.onClick.RemoveListener(OnItemClick); item.onDataChange = null; }