From 94f91124651f4a8285de26a0a020878cd2bbd7eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=80=9D=E6=B5=B7?= <1464576565@qq.com> Date: Thu, 20 Nov 2025 15:40:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AF=B9RecycleclerView=20=E6=97=A0=E9=99=90?= =?UTF-8?q?=E5=BE=AA=E7=8E=AF=E5=88=97=E8=A1=A8=E8=BF=9B=E8=A1=8C=E4=BC=98?= =?UTF-8?q?=E5=8C=96=20=E6=89=A9=E5=B1=95=20=E5=9F=BA=E7=A1=80=E5=B0=81?= =?UTF-8?q?=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Editor/RecyclerView/RecyclerViewEditor.cs | 122 +++++++++++++++++- Editor/RecyclerView/Res/ScrollView.prefab | 13 +- Runtime/RecyclerView/Adapter/Adapter.cs | 12 +- Runtime/RecyclerView/Adapter/GroupAdapter.cs | 60 ++++----- Runtime/RecyclerView/Adapter/IAdapter.cs | 2 +- Runtime/RecyclerView/Adapter/LoopAdapter.cs | 4 +- Runtime/RecyclerView/Adapter/MixedAdapter.cs | 14 +- Runtime/RecyclerView/Data.meta | 3 + Runtime/RecyclerView/Data/ISimpleViewData.cs | 17 +++ .../RecyclerView/Data/ISimpleViewData.cs.meta | 3 + .../Layout/AlignableLinearLayoutManager.cs | 2 +- .../Layout/CircleLayoutManager.cs | 2 +- .../RecyclerView/Layout/GridLayoutManager.cs | 2 +- Runtime/RecyclerView/Layout/ILayoutManager.cs | 2 +- Runtime/RecyclerView/Layout/LayoutManager.cs | 2 +- .../Layout/LinearLayoutManager.cs | 2 +- .../RecyclerView/Layout/MixedLayoutManager.cs | 2 +- .../RecyclerView/Layout/PageLayoutManager.cs | 2 +- Runtime/RecyclerView/RecyclerView.cs | 7 +- .../RecyclerView/Scroller/CircleScroller.cs | 2 +- Runtime/RecyclerView/Scroller/IScroller.cs | 2 +- Runtime/RecyclerView/Scroller/ScrollbarEx.cs | 2 +- Runtime/RecyclerView/Scroller/Scroller.cs | 2 +- Runtime/RecyclerView/UGList.meta | 3 + Runtime/RecyclerView/UGList/UGListBase.cs | 92 +++++++++++++ .../RecyclerView/UGList/UGListBase.cs.meta | 3 + Runtime/RecyclerView/ViewHolder/ViewHolder.cs | 2 +- .../ViewProvider/MixedViewProvider.cs | 2 +- .../ViewProvider/SimpleViewProvider.cs | 2 +- .../RecyclerView/ViewProvider/ViewProvider.cs | 2 +- 30 files changed, 304 insertions(+), 83 deletions(-) create mode 100644 Runtime/RecyclerView/Data.meta create mode 100644 Runtime/RecyclerView/Data/ISimpleViewData.cs create mode 100644 Runtime/RecyclerView/Data/ISimpleViewData.cs.meta create mode 100644 Runtime/RecyclerView/UGList.meta create mode 100644 Runtime/RecyclerView/UGList/UGListBase.cs create mode 100644 Runtime/RecyclerView/UGList/UGListBase.cs.meta diff --git a/Editor/RecyclerView/RecyclerViewEditor.cs b/Editor/RecyclerView/RecyclerViewEditor.cs index f040e2c..0ac3e60 100644 --- a/Editor/RecyclerView/RecyclerViewEditor.cs +++ b/Editor/RecyclerView/RecyclerViewEditor.cs @@ -3,7 +3,7 @@ using UnityEngine; using System; using System.Collections.Generic; using System.Linq; -using AlicizaX.UI.RecyclerView; +using AlicizaX.UI; using UnityEngine.UI; using Object = UnityEngine.Object; @@ -156,6 +156,7 @@ public class RecyclerViewEditor : Editor { _selectedLayoutIndex = newIndex; // 立即更新索引 UpdateLayoutManager(newIndex); + serializedObject.ApplyModifiedProperties(); } } @@ -243,6 +244,7 @@ public class RecyclerViewEditor : Editor if (newIndex != _selectedScrollerIndex) { UpdateScroller(newIndex); + serializedObject.ApplyModifiedProperties(); } } @@ -295,7 +297,123 @@ public class RecyclerViewEditor : Editor void DrawTemplatesSection() { EditorGUILayout.Space(5); - EditorGUILayout.PropertyField(templates, new GUIContent("Item Templates"), true); + EditorGUILayout.LabelField("Item Templates", EditorStyles.boldLabel); + + DrawTemplatesList(); + + DrawDragAndDropArea(); + } + + void DrawTemplatesList() + { + if (templates == null || !templates.isArray) return; + + serializedObject.Update(); + + for (int i = 0; i < templates.arraySize; i++) + { + DrawTemplateItem(i); + } + } + + void DrawTemplateItem(int index) + { + if (index < 0 || index >= templates.arraySize) return; + + SerializedProperty item = templates.GetArrayElementAtIndex(index); + + EditorGUILayout.BeginHorizontal(); + { + EditorGUI.BeginDisabledGroup(true); + EditorGUILayout.PropertyField(item, GUIContent.none, true); + EditorGUI.EndDisabledGroup(); + + if (GUILayout.Button("×", GUILayout.Width(20), GUILayout.Height(EditorGUIUtility.singleLineHeight))) + { + RemoveTemplateItem(index); + return; + } + } + EditorGUILayout.EndHorizontal(); + } + + void RemoveTemplateItem(int index) + { + if (templates == null || index < 0 || index >= templates.arraySize) return; + + templates.DeleteArrayElementAtIndex(index); + serializedObject.ApplyModifiedProperties(); + GUIUtility.ExitGUI(); + } + + void DrawDragAndDropArea() + { + Rect dropArea = GUILayoutUtility.GetRect(0f, 50f, GUILayout.ExpandWidth(true)); + GUI.Box(dropArea, "Drag Template to here", EditorStyles.helpBox); + + // 处理拖拽事件 + HandleDragAndDrop(dropArea); + } + + void HandleDragAndDrop(Rect dropArea) + { + Event evt = Event.current; + + switch (evt.type) + { + case EventType.DragUpdated: + case EventType.DragPerform: + if (!dropArea.Contains(evt.mousePosition)) + return; + + DragAndDrop.visualMode = DragAndDropVisualMode.Copy; + + if (evt.type == EventType.DragPerform) + { + DragAndDrop.AcceptDrag(); + AddTemplatesFromDrag(); + evt.Use(); + } + + break; + } + } + + void AddTemplatesFromDrag() + { + foreach (UnityEngine.Object draggedObject in DragAndDrop.objectReferences) + { + if (draggedObject is GameObject gameObject && gameObject.GetComponent() != null) + { + AddTemplate(gameObject); + } + else + { + Debug.LogWarning("模板必须为GameObject资源 同时挂载继承ViewHolder脚本!"); + } + } + } + + void AddTemplate(GameObject templatePrefab) + { + if (templates == null) return; + + for (int i = 0; i < templates.arraySize; i++) + { + SerializedProperty existingItem = templates.GetArrayElementAtIndex(i); + var refrence = (ViewHolder)existingItem.objectReferenceValue; + if (refrence.GetType() != templatePrefab.GetType()) + { + Debug.LogWarning("列表元素重复项,禁止再次添加!"); + return; + } + } + + templates.arraySize++; + SerializedProperty newItem = templates.GetArrayElementAtIndex(templates.arraySize - 1); + newItem.objectReferenceValue = templatePrefab; + + serializedObject.ApplyModifiedProperties(); } #endregion diff --git a/Editor/RecyclerView/Res/ScrollView.prefab b/Editor/RecyclerView/Res/ScrollView.prefab index dc7e40a..2b19426 100644 --- a/Editor/RecyclerView/Res/ScrollView.prefab +++ b/Editor/RecyclerView/Res/ScrollView.prefab @@ -102,16 +102,17 @@ MonoBehaviour: templates: [] _scrollerTypeName: AlicizaX.UI.RecyclerView.Scroller _scroller: {fileID: 144409482669617178} - _layoutManagerTypeName: AlicizaX.UI.RecyclerView.LinearLayoutManager + _showScrollBar: 0 + _scrollbar: {fileID: 0} + _layoutManagerTypeName: AlicizaX.UI.LinearLayoutManager _layoutManager: - rid: 6528754475160043629 + rid: 7492395943315111994 references: version: 2 RefIds: - - rid: 6528754475160043629 - type: {class: LinearLayoutManager, ns: AlicizaX.UI.RecyclerView, asm: AlicizaX.UI.Extension} - data: - testValue: 0 + - rid: 7492395943315111994 + type: {class: LinearLayoutManager, ns: AlicizaX.UI, asm: AlicizaX.UI.Extension} + data: --- !u!114 &144409482669617178 MonoBehaviour: m_ObjectHideFlags: 0 diff --git a/Runtime/RecyclerView/Adapter/Adapter.cs b/Runtime/RecyclerView/Adapter/Adapter.cs index bea7917..aa3720f 100644 --- a/Runtime/RecyclerView/Adapter/Adapter.cs +++ b/Runtime/RecyclerView/Adapter/Adapter.cs @@ -1,9 +1,9 @@ using System; using System.Collections.Generic; -namespace AlicizaX.UI.RecyclerView +namespace AlicizaX.UI { - public class Adapter : IAdapter + public class Adapter : IAdapter where T : ISimpleViewData { protected RecyclerView recyclerView; @@ -11,13 +11,11 @@ namespace AlicizaX.UI.RecyclerView protected Action onItemClick; protected int choiceIndex = -1; + public int ChoiceIndex { get => choiceIndex; - set - { - SetChoiceIndex(value); - } + set { SetChoiceIndex(value); } } public Adapter(RecyclerView recyclerView) : this(recyclerView, new List(), null) @@ -71,7 +69,7 @@ namespace AlicizaX.UI.RecyclerView recyclerView.Refresh(); } - public virtual void SetList(List list) + protected internal virtual void SetList(List list) { this.list = list; recyclerView.Reset(); diff --git a/Runtime/RecyclerView/Adapter/GroupAdapter.cs b/Runtime/RecyclerView/Adapter/GroupAdapter.cs index 585ca9e..4f0cb5b 100644 --- a/Runtime/RecyclerView/Adapter/GroupAdapter.cs +++ b/Runtime/RecyclerView/Adapter/GroupAdapter.cs @@ -1,11 +1,11 @@ using System; using System.Collections.Generic; -namespace AlicizaX.UI.RecyclerView +namespace AlicizaX.UI { - public class GroupAdapter : Adapter + public class GroupAdapter : Adapter where TData : IGroupViewData, new() { - private readonly List showList = new(); + private readonly List showList = new(); private string groupViewName; public GroupAdapter(RecyclerView recyclerView, string groupViewName) : base(recyclerView) @@ -13,14 +13,19 @@ namespace AlicizaX.UI.RecyclerView this.groupViewName = groupViewName; } - public GroupAdapter(RecyclerView recyclerView, List list) : base(recyclerView, list) + public GroupAdapter(RecyclerView recyclerView, List list) : base(recyclerView, list) { } - public GroupAdapter(RecyclerView recyclerView, List list, Action onItemClick) : base(recyclerView, list, onItemClick) + public GroupAdapter(RecyclerView recyclerView, List list, Action onItemClick) : base(recyclerView, list, onItemClick) { } + public GroupAdapter(RecyclerView recyclerView) : base(recyclerView) + { + } + + public override int GetItemCount() { return showList.Count; @@ -28,21 +33,21 @@ namespace AlicizaX.UI.RecyclerView public override string GetViewName(int index) { - return showList[index].viewName; + return showList[index].TemplateName; } public override void OnBindViewHolder(ViewHolder viewHolder, int index) { if (index < 0 || index >= GetItemCount()) return; - GroupData data = showList[index]; + TData data = showList[index]; viewHolder.BindViewData(data); viewHolder.BindItemClick(data, t => { - if (data.viewName == groupViewName) + if (data.TemplateName == groupViewName) { - data.bExpand = !data.bExpand; + data.Expanded = !data.Expanded; NotifyDataChanged(); } else @@ -57,15 +62,15 @@ namespace AlicizaX.UI.RecyclerView { foreach (var data in list) { - CreateGroup(data.type); + CreateGroup(data.Type); } - var groupList = showList.FindAll(data => data.viewName == groupViewName); + var groupList = showList.FindAll(data => data.TemplateName == groupViewName); for (int i = 0; i < groupList.Count; i++) { int index = showList.IndexOf(groupList[i]); Collapse(index); - if (groupList[i].bExpand) + if (groupList[i].Expanded) { Expand(index); } @@ -73,7 +78,7 @@ namespace AlicizaX.UI.RecyclerView foreach (var group in groupList) { - if (list.FindAll(data => data.type == group.type).Count == 0) + if (list.FindAll(data => data.Type == group.Type).Count == 0) { showList.Remove(group); } @@ -82,7 +87,7 @@ namespace AlicizaX.UI.RecyclerView base.NotifyDataChanged(); } - public override void SetList(List list) + protected internal override void SetList(List list) { showList.Clear(); base.SetList(list); @@ -90,39 +95,28 @@ namespace AlicizaX.UI.RecyclerView private void CreateGroup(int type) { - var groupData = showList.Find(data => data.type == type && data.viewName == groupViewName); + var groupData = showList.Find(data => data.Type == type && data.TemplateName == groupViewName); if (groupData == null) { - groupData = new GroupData(type, groupViewName, type.ToString()); + groupData = new TData + { + TemplateName = groupViewName, + Type = type + }; showList.Add(groupData); } } public void Expand(int index) { - var expandList = list.FindAll(data => data.type == showList[index].type); + var expandList = list.FindAll(data => data.Type == showList[index].Type); showList.InsertRange(index + 1, expandList); } public void Collapse(int index) { - var collapseList = showList.FindAll(data => data.type == showList[index].type && data.viewName != groupViewName); + var collapseList = showList.FindAll(data => data.Type == showList[index].Type && data.TemplateName != groupViewName); showList.RemoveRange(index + 1, collapseList.Count); } } - - public class GroupData - { - public bool bExpand; - public int type; - public string viewName; - public string name; - - public GroupData(int type, string viewName, string name) - { - this.type = type; - this.viewName = viewName; - this.name = name; - } - } } diff --git a/Runtime/RecyclerView/Adapter/IAdapter.cs b/Runtime/RecyclerView/Adapter/IAdapter.cs index a0648ae..d2b9d06 100644 --- a/Runtime/RecyclerView/Adapter/IAdapter.cs +++ b/Runtime/RecyclerView/Adapter/IAdapter.cs @@ -1,4 +1,4 @@ -namespace AlicizaX.UI.RecyclerView +namespace AlicizaX.UI { public interface IAdapter { diff --git a/Runtime/RecyclerView/Adapter/LoopAdapter.cs b/Runtime/RecyclerView/Adapter/LoopAdapter.cs index 6a7ae6a..d1f2c15 100644 --- a/Runtime/RecyclerView/Adapter/LoopAdapter.cs +++ b/Runtime/RecyclerView/Adapter/LoopAdapter.cs @@ -1,9 +1,9 @@ using System; using System.Collections.Generic; -namespace AlicizaX.UI.RecyclerView +namespace AlicizaX.UI { - public class LoopAdapter : Adapter + public class LoopAdapter : Adapter where T : ISimpleViewData { public LoopAdapter(RecyclerView recyclerView) : base(recyclerView) { diff --git a/Runtime/RecyclerView/Adapter/MixedAdapter.cs b/Runtime/RecyclerView/Adapter/MixedAdapter.cs index 7e134b3..437d1f6 100644 --- a/Runtime/RecyclerView/Adapter/MixedAdapter.cs +++ b/Runtime/RecyclerView/Adapter/MixedAdapter.cs @@ -1,19 +1,19 @@ using System; using System.Collections.Generic; -namespace AlicizaX.UI.RecyclerView +namespace AlicizaX.UI { - public class MixedAdapter : Adapter + public class MixedAdapter : Adapter where TData : IMixedViewData { public MixedAdapter(RecyclerView recyclerView) : base(recyclerView) { } - public MixedAdapter(RecyclerView recyclerView, List list) : base(recyclerView, list) + public MixedAdapter(RecyclerView recyclerView, List list) : base(recyclerView, list) { } - public MixedAdapter(RecyclerView recyclerView, List list, Action onItemClick) : base(recyclerView, list, onItemClick) + public MixedAdapter(RecyclerView recyclerView, List list, Action onItemClick) : base(recyclerView, list, onItemClick) { } @@ -22,10 +22,4 @@ namespace AlicizaX.UI.RecyclerView return list[index].TemplateName; } } - - public interface IMixedData - { - string TemplateName { get; set; } - } - } diff --git a/Runtime/RecyclerView/Data.meta b/Runtime/RecyclerView/Data.meta new file mode 100644 index 0000000..9bd39ec --- /dev/null +++ b/Runtime/RecyclerView/Data.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 05736c35a54b467a966b416c1461ba61 +timeCreated: 1763617414 \ No newline at end of file diff --git a/Runtime/RecyclerView/Data/ISimpleViewData.cs b/Runtime/RecyclerView/Data/ISimpleViewData.cs new file mode 100644 index 0000000..09ce2b4 --- /dev/null +++ b/Runtime/RecyclerView/Data/ISimpleViewData.cs @@ -0,0 +1,17 @@ +namespace AlicizaX.UI +{ + public interface ISimpleViewData + { + } + + public interface IMixedViewData : ISimpleViewData + { + string TemplateName { get; set; } + } + + public interface IGroupViewData : IMixedViewData + { + bool Expanded { get; set; } + int Type { get; set; } + } +} diff --git a/Runtime/RecyclerView/Data/ISimpleViewData.cs.meta b/Runtime/RecyclerView/Data/ISimpleViewData.cs.meta new file mode 100644 index 0000000..2f33bfc --- /dev/null +++ b/Runtime/RecyclerView/Data/ISimpleViewData.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a059b7119e284e37a88a569f76b40579 +timeCreated: 1763617420 \ No newline at end of file diff --git a/Runtime/RecyclerView/Layout/AlignableLinearLayoutManager.cs b/Runtime/RecyclerView/Layout/AlignableLinearLayoutManager.cs index 457dafa..20c6767 100644 --- a/Runtime/RecyclerView/Layout/AlignableLinearLayoutManager.cs +++ b/Runtime/RecyclerView/Layout/AlignableLinearLayoutManager.cs @@ -1,7 +1,7 @@ using System; using UnityEngine; -namespace AlicizaX.UI.RecyclerView +namespace AlicizaX.UI { [Serializable] public class AlignableLinearLayoutManager : LinearLayoutManager diff --git a/Runtime/RecyclerView/Layout/CircleLayoutManager.cs b/Runtime/RecyclerView/Layout/CircleLayoutManager.cs index 341d533..8bd0015 100644 --- a/Runtime/RecyclerView/Layout/CircleLayoutManager.cs +++ b/Runtime/RecyclerView/Layout/CircleLayoutManager.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using UnityEngine; -namespace AlicizaX.UI.RecyclerView +namespace AlicizaX.UI { public class CircleLayoutManager : LayoutManager { diff --git a/Runtime/RecyclerView/Layout/GridLayoutManager.cs b/Runtime/RecyclerView/Layout/GridLayoutManager.cs index 09f0c68..5d6a1b7 100644 --- a/Runtime/RecyclerView/Layout/GridLayoutManager.cs +++ b/Runtime/RecyclerView/Layout/GridLayoutManager.cs @@ -1,7 +1,7 @@ using System; using UnityEngine; -namespace AlicizaX.UI.RecyclerView +namespace AlicizaX.UI { [Serializable] public class GridLayoutManager : LayoutManager diff --git a/Runtime/RecyclerView/Layout/ILayoutManager.cs b/Runtime/RecyclerView/Layout/ILayoutManager.cs index 6cfd075..47cfdec 100644 --- a/Runtime/RecyclerView/Layout/ILayoutManager.cs +++ b/Runtime/RecyclerView/Layout/ILayoutManager.cs @@ -1,6 +1,6 @@ using UnityEngine; -namespace AlicizaX.UI.RecyclerView +namespace AlicizaX.UI { public interface ILayoutManager { diff --git a/Runtime/RecyclerView/Layout/LayoutManager.cs b/Runtime/RecyclerView/Layout/LayoutManager.cs index c2295af..e0a8e5a 100644 --- a/Runtime/RecyclerView/Layout/LayoutManager.cs +++ b/Runtime/RecyclerView/Layout/LayoutManager.cs @@ -1,7 +1,7 @@ using System; using UnityEngine; -namespace AlicizaX.UI.RecyclerView +namespace AlicizaX.UI { [Serializable] public abstract class LayoutManager : ILayoutManager diff --git a/Runtime/RecyclerView/Layout/LinearLayoutManager.cs b/Runtime/RecyclerView/Layout/LinearLayoutManager.cs index eef057f..f0d0281 100644 --- a/Runtime/RecyclerView/Layout/LinearLayoutManager.cs +++ b/Runtime/RecyclerView/Layout/LinearLayoutManager.cs @@ -1,6 +1,6 @@ using UnityEngine; -namespace AlicizaX.UI.RecyclerView +namespace AlicizaX.UI { public class LinearLayoutManager : LayoutManager { diff --git a/Runtime/RecyclerView/Layout/MixedLayoutManager.cs b/Runtime/RecyclerView/Layout/MixedLayoutManager.cs index 4230c20..0986bf6 100644 --- a/Runtime/RecyclerView/Layout/MixedLayoutManager.cs +++ b/Runtime/RecyclerView/Layout/MixedLayoutManager.cs @@ -1,6 +1,6 @@ using UnityEngine; -namespace AlicizaX.UI.RecyclerView +namespace AlicizaX.UI { public class MixedLayoutManager : LayoutManager { diff --git a/Runtime/RecyclerView/Layout/PageLayoutManager.cs b/Runtime/RecyclerView/Layout/PageLayoutManager.cs index c7cada9..f6e7234 100644 --- a/Runtime/RecyclerView/Layout/PageLayoutManager.cs +++ b/Runtime/RecyclerView/Layout/PageLayoutManager.cs @@ -2,7 +2,7 @@ using System; using System.Collections.Generic; using UnityEngine; -namespace AlicizaX.UI.RecyclerView +namespace AlicizaX.UI { public class PageLayoutManager : LinearLayoutManager { diff --git a/Runtime/RecyclerView/RecyclerView.cs b/Runtime/RecyclerView/RecyclerView.cs index ec247d7..0bf3528 100644 --- a/Runtime/RecyclerView/RecyclerView.cs +++ b/Runtime/RecyclerView/RecyclerView.cs @@ -3,7 +3,7 @@ using UnityEngine; using UnityEngine.Serialization; using UnityEngine.UI; -namespace AlicizaX.UI.RecyclerView +namespace AlicizaX.UI { public class RecyclerView : MonoBehaviour { @@ -91,7 +91,6 @@ namespace AlicizaX.UI.RecyclerView public ViewHolder[] Templates { get => templates; - set => templates = value; } @@ -132,13 +131,10 @@ namespace AlicizaX.UI.RecyclerView } } - public Scrollbar Scrollbar => _scrollbar; private IAdapter _adapter; - public LayoutManager LayoutManager => _layoutManager; - public Action OnIndexChanged; public Action OnScrollValueChanged; public Action OnMoveingChanged; @@ -272,7 +268,6 @@ namespace AlicizaX.UI.RecyclerView _adapter = adapter; ViewProvider.Adapter = _adapter; ViewProvider.LayoutManager = _layoutManager; - ViewProvider.LayoutManager = _layoutManager; _layoutManager.RecyclerView = this; _layoutManager.Adapter = _adapter; _layoutManager.ViewProvider = viewProvider; diff --git a/Runtime/RecyclerView/Scroller/CircleScroller.cs b/Runtime/RecyclerView/Scroller/CircleScroller.cs index 7273e1e..c3de224 100644 --- a/Runtime/RecyclerView/Scroller/CircleScroller.cs +++ b/Runtime/RecyclerView/Scroller/CircleScroller.cs @@ -2,7 +2,7 @@ using System; using UnityEngine; using UnityEngine.EventSystems; -namespace AlicizaX.UI.RecyclerView +namespace AlicizaX.UI { [Serializable] public class CircleScroller : Scroller diff --git a/Runtime/RecyclerView/Scroller/IScroller.cs b/Runtime/RecyclerView/Scroller/IScroller.cs index 83fa3a1..0534c22 100644 --- a/Runtime/RecyclerView/Scroller/IScroller.cs +++ b/Runtime/RecyclerView/Scroller/IScroller.cs @@ -1,6 +1,6 @@ using UnityEngine.Events; -namespace AlicizaX.UI.RecyclerView +namespace AlicizaX.UI { public interface IScroller { diff --git a/Runtime/RecyclerView/Scroller/ScrollbarEx.cs b/Runtime/RecyclerView/Scroller/ScrollbarEx.cs index 641f10c..155b5fb 100644 --- a/Runtime/RecyclerView/Scroller/ScrollbarEx.cs +++ b/Runtime/RecyclerView/Scroller/ScrollbarEx.cs @@ -3,7 +3,7 @@ using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; -namespace AlicizaX.UI.RecyclerView +namespace AlicizaX.UI { public class ScrollbarEx : MonoBehaviour, IBeginDragHandler, IEndDragHandler, IPointerEnterHandler, IPointerExitHandler { diff --git a/Runtime/RecyclerView/Scroller/Scroller.cs b/Runtime/RecyclerView/Scroller/Scroller.cs index 6d27bc9..b018f07 100644 --- a/Runtime/RecyclerView/Scroller/Scroller.cs +++ b/Runtime/RecyclerView/Scroller/Scroller.cs @@ -3,7 +3,7 @@ using System.Collections; using UnityEngine; using UnityEngine.EventSystems; -namespace AlicizaX.UI.RecyclerView +namespace AlicizaX.UI { [Serializable] public class Scroller : MonoBehaviour, IScroller, IBeginDragHandler, IEndDragHandler, IDragHandler, IScrollHandler diff --git a/Runtime/RecyclerView/UGList.meta b/Runtime/RecyclerView/UGList.meta new file mode 100644 index 0000000..dd7451a --- /dev/null +++ b/Runtime/RecyclerView/UGList.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 369d2829a7a2462ba93212b3d8afe0fa +timeCreated: 1763615925 \ No newline at end of file diff --git a/Runtime/RecyclerView/UGList/UGListBase.cs b/Runtime/RecyclerView/UGList/UGListBase.cs new file mode 100644 index 0000000..bbb7ab9 --- /dev/null +++ b/Runtime/RecyclerView/UGList/UGListBase.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.Generic; + +namespace AlicizaX.UI +{ + public abstract class UGListBase where TAdapter : Adapter where TData : ISimpleViewData + { + protected readonly RecyclerView _recyclerView; + + protected readonly TAdapter _adapter; + + public RecyclerView RecyclerView => _recyclerView; + + public UGListBase(RecyclerView recyclerView, TAdapter adapter, Action onItemClick = null) + { + _recyclerView = recyclerView; + _adapter = adapter; + + if (_recyclerView != null) + { + _recyclerView.SetAdapter(_adapter); + } + + if (onItemClick != null) + { + _adapter.SetOnItemClick(onItemClick); + } + } + + public TAdapter Adapter => _adapter; + + private List _datas; + + public List Data + { + get => _datas; + set + { + _datas = value; + _adapter.SetList(_datas); + } + } + } + + public class UGList : UGListBase> where TData : ISimpleViewData + { + public UGList(RecyclerView recyclerView, Action onItemClick = null) + : base(recyclerView, new Adapter(recyclerView), onItemClick) + { + } + } + + public class UGGroupList : UGListBase> where TData : class, IGroupViewData, new() + { + public UGGroupList(RecyclerView recyclerView, string groupViewName, Action onItemClick = null) + : base(recyclerView, new GroupAdapter(recyclerView, groupViewName), onItemClick) + { + } + } + + public class UGLoopList : UGListBase> where TData : ISimpleViewData, new() + { + public UGLoopList(RecyclerView recyclerView, Action onItemClick = null) + : base(recyclerView, new LoopAdapter(recyclerView), onItemClick) + { + } + } + + public class UGMixedList : UGListBase> where TData : IMixedViewData + { + public UGMixedList(RecyclerView recyclerView, Action onItemClick = null) + : base(recyclerView, new MixedAdapter(recyclerView), onItemClick) + { + } + } + + public static class UGList + { + public static UGList Create(RecyclerView recyclerView, Action onItemClick = null) where TData : ISimpleViewData + => new UGList(recyclerView, onItemClick); + + public static UGGroupList CreateGroup(RecyclerView recyclerView, string groupViewName, Action onItemClick = null) where TData : class, IGroupViewData, new() + => new UGGroupList(recyclerView, groupViewName, onItemClick); + + public static UGLoopList CreateLoop(RecyclerView recyclerView, Action onItemClick = null) where TData : ISimpleViewData, new() + => new UGLoopList(recyclerView, onItemClick); + + public static UGMixedList CreateMixed(RecyclerView recyclerView, Action onItemClick = null) where TData : IMixedViewData + => new UGMixedList(recyclerView, onItemClick); + } + +} diff --git a/Runtime/RecyclerView/UGList/UGListBase.cs.meta b/Runtime/RecyclerView/UGList/UGListBase.cs.meta new file mode 100644 index 0000000..c76971e --- /dev/null +++ b/Runtime/RecyclerView/UGList/UGListBase.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 19892a10438348b3b7e7cac3e2201b9e +timeCreated: 1763615934 \ No newline at end of file diff --git a/Runtime/RecyclerView/ViewHolder/ViewHolder.cs b/Runtime/RecyclerView/ViewHolder/ViewHolder.cs index a022792..1ff2047 100644 --- a/Runtime/RecyclerView/ViewHolder/ViewHolder.cs +++ b/Runtime/RecyclerView/ViewHolder/ViewHolder.cs @@ -3,7 +3,7 @@ using AlicizaX.UI.Extension; using UnityEngine; using UnityEngine.UI; -namespace AlicizaX.UI.RecyclerView +namespace AlicizaX.UI { public abstract class ViewHolder : MonoBehaviour { diff --git a/Runtime/RecyclerView/ViewProvider/MixedViewProvider.cs b/Runtime/RecyclerView/ViewProvider/MixedViewProvider.cs index c33ab22..3c433f8 100644 --- a/Runtime/RecyclerView/ViewProvider/MixedViewProvider.cs +++ b/Runtime/RecyclerView/ViewProvider/MixedViewProvider.cs @@ -4,7 +4,7 @@ using System.Linq; using SimpleObjectPool; using UnityEngine; -namespace AlicizaX.UI.RecyclerView +namespace AlicizaX.UI { public class MixedViewProvider : ViewProvider { diff --git a/Runtime/RecyclerView/ViewProvider/SimpleViewProvider.cs b/Runtime/RecyclerView/ViewProvider/SimpleViewProvider.cs index a169970..5815099 100644 --- a/Runtime/RecyclerView/ViewProvider/SimpleViewProvider.cs +++ b/Runtime/RecyclerView/ViewProvider/SimpleViewProvider.cs @@ -1,7 +1,7 @@ using System; using SimpleObjectPool; -namespace AlicizaX.UI.RecyclerView +namespace AlicizaX.UI { public sealed class SimpleViewProvider : ViewProvider { diff --git a/Runtime/RecyclerView/ViewProvider/ViewProvider.cs b/Runtime/RecyclerView/ViewProvider/ViewProvider.cs index 1fb5431..d734103 100644 --- a/Runtime/RecyclerView/ViewProvider/ViewProvider.cs +++ b/Runtime/RecyclerView/ViewProvider/ViewProvider.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using AlicizaX.UI.Runtime; using UnityEngine; -namespace AlicizaX.UI.RecyclerView +namespace AlicizaX.UI { /// /// 提供和管理 ViewHolder