using System.Collections.Generic; using UnityEngine; namespace AlicizaX.UI { /// /// 提供和管理 ViewHolder /// 负责 ViewHolder 的创建、回收和复用 /// public abstract class ViewProvider { private readonly List viewHolders = new(); /// /// 获取或设置数据适配器 /// public IAdapter Adapter { get; set; } /// /// 获取或设置布局管理器 /// public LayoutManager LayoutManager { get; set; } /// /// 获取当前所有活动的 ViewHolder 列表 /// public List ViewHolders => viewHolders; protected RecyclerView recyclerView; protected ViewHolder[] templates; /// /// 构造函数 /// /// 关联的 RecyclerView 实例 /// ViewHolder 模板数组 public ViewProvider(RecyclerView recyclerView, ViewHolder[] templates) { this.recyclerView = recyclerView; this.templates = templates; } /// /// 根据视图名称获取对应的模板(抽象方法,由子类实现) /// /// 视图名称 /// 对应的 ViewHolder 模板 public abstract ViewHolder GetTemplate(string viewName); /// /// 获取所有模板(抽象方法,由子类实现) /// /// 所有 ViewHolder 模板数组 public abstract ViewHolder[] GetTemplates(); /// /// 从对象池中分配一个 ViewHolder(抽象方法,由子类实现) /// /// 视图名称 /// 分配的 ViewHolder 实例 public abstract ViewHolder Allocate(string viewName); /// /// 将 ViewHolder 回收到对象池(抽象方法,由子类实现) /// /// 视图名称 /// 要回收的 ViewHolder public abstract void Free(string viewName, ViewHolder viewHolder); /// /// 重置 ViewProvider 状态(抽象方法,由子类实现) /// public abstract void Reset(); /// /// 创建指定索引的 ViewHolder /// 从对象池中获取或创建新的 ViewHolder,并进行布局和数据绑定 /// /// 数据索引 public void CreateViewHolder(int index) { for (int i = index; i < index + LayoutManager.Unit; i++) { if (i > Adapter.GetItemCount() - 1) break; string viewName = Adapter.GetViewName(i); var viewHolder = Allocate(viewName); viewHolder.Name = viewName; viewHolder.Index = i; viewHolders.Add(viewHolder); LayoutManager.Layout(viewHolder, i); Adapter.OnBindViewHolder(viewHolder, i); } } /// /// 移除指定索引的 ViewHolder /// 将 ViewHolder 从活动列表中移除并回收到对象池 /// /// 数据索引 public void RemoveViewHolder(int index) { for (int i = index; i < index + LayoutManager.Unit; i++) { if (i > Adapter.GetItemCount() - 1) break; int viewHolderIndex = GetViewHolderIndex(i); if (viewHolderIndex < 0 || viewHolderIndex >= viewHolders.Count) return; var viewHolder = viewHolders[viewHolderIndex]; viewHolders.RemoveAt(viewHolderIndex); viewHolder.OnRecycled(); Free(viewHolder.Name, viewHolder); } } /// /// 根据数据的下标获取对应的 ViewHolder /// /// 数据的下标 /// public ViewHolder GetViewHolder(int index) { foreach (var viewHolder in viewHolders) { if (viewHolder.Index == index) { return viewHolder; } } return null; } /// /// 根据数据的下标获取 ViewHolder 的下标 /// /// 数据的下标 /// public int GetViewHolderIndex(int index) { for (int i = 0; i < viewHolders.Count; i++) { if (viewHolders[i].Index == index) { return i; } } return -1; } /// /// 清空所有 ViewHolder /// 将所有活动的 ViewHolder 回收到对象池并清空列表 /// public void Clear() { foreach (var viewHolder in viewHolders) { Free(viewHolder.Name, viewHolder); } viewHolders.Clear(); } /// /// 计算 ViewHolder 的尺寸 /// /// /// public Vector2 CalculateViewSize(int index) { Vector2 size = GetTemplate(Adapter.GetViewName(index)).SizeDelta; return size; } /// /// 获取数据项总数 /// /// 数据项总数,如果没有适配器则返回 0 public int GetItemCount() { return Adapter == null ? 0 : Adapter.GetItemCount(); } } }