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);
Adapter?.OnRecycleViewHolder(viewHolder);
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)
{
Adapter?.OnRecycleViewHolder(viewHolder);
viewHolder.OnRecycled();
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();
}
}
}