From bbee53ccf6b9469f1b8b4032106a73ffb3b353a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=80=9D=E6=B5=B7?= <1464576565@qq.com> Date: Wed, 2 Apr 2025 14:53:08 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9RecyclerView?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Runtime/RecyclerView/RecyclerView.cs | 31 +++++++++++++++---- Runtime/RecyclerView/ViewHolder/ViewHolder.cs | 12 ++++++- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/Runtime/RecyclerView/RecyclerView.cs b/Runtime/RecyclerView/RecyclerView.cs index ab3e128..09fcc09 100644 --- a/Runtime/RecyclerView/RecyclerView.cs +++ b/Runtime/RecyclerView/RecyclerView.cs @@ -7,6 +7,7 @@ namespace AlicizaX.UI.RecyclerView public class RecyclerView : MonoBehaviour { [SerializeField] private Direction direction; + public Direction Direction { get => direction; @@ -14,6 +15,7 @@ namespace AlicizaX.UI.RecyclerView } [SerializeField] private Alignment alignment; + public Alignment Alignment { get => alignment; @@ -21,6 +23,7 @@ namespace AlicizaX.UI.RecyclerView } [SerializeField] private Vector2 spacing; + public Vector2 Spacing { get => spacing; @@ -28,6 +31,7 @@ namespace AlicizaX.UI.RecyclerView } [SerializeField] private Vector2 padding; + public Vector2 Padding { get => padding; @@ -35,6 +39,7 @@ namespace AlicizaX.UI.RecyclerView } [SerializeField] private bool scroll; + public bool Scroll { get => scroll; @@ -42,6 +47,7 @@ namespace AlicizaX.UI.RecyclerView } [SerializeField] private bool snap; + public bool Snap { get => snap; @@ -49,6 +55,7 @@ namespace AlicizaX.UI.RecyclerView } [SerializeField, Range(1f, 50f)] private float scrollSpeed = 7f; + public float ScrollSpeed { get => scrollSpeed; @@ -56,6 +63,7 @@ namespace AlicizaX.UI.RecyclerView } [SerializeField, Range(10f, 50f)] private float wheelSpeed = 30f; + public float WheeelSpeed { get => wheelSpeed; @@ -63,6 +71,7 @@ namespace AlicizaX.UI.RecyclerView } [SerializeField] private ViewHolder[] templates; + public ViewHolder[] Templates { get => templates; @@ -76,6 +85,7 @@ namespace AlicizaX.UI.RecyclerView private int startIndex, endIndex; private int currentIndex; + public int CurrentIndex { get => currentIndex; @@ -85,6 +95,7 @@ namespace AlicizaX.UI.RecyclerView public bool CanScroll => true; private RectTransform content; + public RectTransform Content { get @@ -93,6 +104,7 @@ namespace AlicizaX.UI.RecyclerView { content = transform.GetChild(0).GetComponent(); } + return content; } } @@ -118,6 +130,7 @@ namespace AlicizaX.UI.RecyclerView ConfigScroller(); } } + return scroller; } } @@ -136,6 +149,7 @@ namespace AlicizaX.UI.RecyclerView scrollbar.gameObject.AddComponent().OnDragEnd = OnScrollbarDragEnd; } } + return scrollbar; } } @@ -236,6 +250,14 @@ namespace AlicizaX.UI.RecyclerView } } + private void Awake() + { + for (int i = 0; i < templates.Length; i++) + { + templates[i].gameObject.SetActive(false); + } + } + private void OnDestroy() { viewProvider?.Dispose(); @@ -248,6 +270,7 @@ namespace AlicizaX.UI.RecyclerView { scroller.Position = 0; } + if (scrollbar != null) { scrollbar.SetValueWithoutNotify(0); @@ -330,12 +353,8 @@ namespace AlicizaX.UI.RecyclerView else { Scrollbar.gameObject.SetActive(true); - Scrollbar.direction = direction == Direction.Vertical ? - Scrollbar.Direction.TopToBottom : - Scrollbar.Direction.LeftToRight; - Scrollbar.size = direction == Direction.Vertical ? - Scroller.ViewSize.y / Scroller.ContentSize.y : - Scroller.ViewSize.x / Scroller.ContentSize.x; + Scrollbar.direction = direction == Direction.Vertical ? Scrollbar.Direction.TopToBottom : Scrollbar.Direction.LeftToRight; + Scrollbar.size = direction == Direction.Vertical ? Scroller.ViewSize.y / Scroller.ContentSize.y : Scroller.ViewSize.x / Scroller.ContentSize.x; } } } diff --git a/Runtime/RecyclerView/ViewHolder/ViewHolder.cs b/Runtime/RecyclerView/ViewHolder/ViewHolder.cs index d6ae33f..48e7378 100644 --- a/Runtime/RecyclerView/ViewHolder/ViewHolder.cs +++ b/Runtime/RecyclerView/ViewHolder/ViewHolder.cs @@ -25,6 +25,8 @@ namespace AlicizaX.UI.RecyclerView public string Name { get; set; } public int Index { get; set; } + public bool ChoiseState { private set; get; } + public Vector2 SizeDelta => RectTransform.sizeDelta; public virtual void OnStop() @@ -42,9 +44,17 @@ namespace AlicizaX.UI.RecyclerView } } - public virtual void BindChoiceState(bool state) + protected internal void BindChoiceState(bool state) { + if (ChoiseState != state) + { + ChoiseState = state; + OnBindChoiceState(state); + } } + protected internal virtual void OnBindChoiceState(bool state) + { + } } }