com.alicizax.unity.ui.exten.../Runtime/RecyclerView/ViewProvider/ViewProvider.cs

148 lines
4.1 KiB
C#
Raw Normal View History

2025-04-01 15:21:02 +08:00
using System;
2025-03-12 20:59:12 +08:00
using System.Collections.Generic;
2025-04-01 15:21:02 +08:00
using AlicizaX.UI.Runtime;
2025-03-12 20:59:12 +08:00
using UnityEngine;
namespace AlicizaX.UI.RecyclerView
{
/// <summary>
/// 提供和管理 ViewHolder
/// </summary>
2025-04-01 15:21:02 +08:00
public abstract class ViewProvider : IDisposable
2025-03-12 20:59:12 +08:00
{
private readonly List<ViewHolder> viewHolders = new();
public IAdapter Adapter { get; set; }
public LayoutManager LayoutManager { get; set; }
public List<ViewHolder> ViewHolders => viewHolders;
protected RecyclerView recyclerView;
protected ViewHolder[] templates;
public ViewProvider(RecyclerView recyclerView, ViewHolder[] templates)
{
this.recyclerView = recyclerView;
this.templates = templates;
}
public abstract ViewHolder GetTemplate(string viewName);
public abstract ViewHolder[] GetTemplates();
public abstract ViewHolder Allocate(string viewName);
public abstract void Free(string viewName, ViewHolder viewHolder);
public abstract void Reset();
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);
2025-03-28 13:34:33 +08:00
// viewHolder.OnStart();
2025-03-12 20:59:12 +08:00
viewHolder.Name = viewName;
viewHolder.Index = i;
viewHolders.Add(viewHolder);
LayoutManager.Layout(viewHolder, i);
Adapter.OnBindViewHolder(viewHolder, i);
}
}
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.OnStop();
Free(viewHolder.Name, viewHolder);
}
}
/// <summary>
/// 根据数据的下标获取对应的 ViewHolder
/// </summary>
/// <param name="index">数据的下标</param>
/// <returns></returns>
public ViewHolder GetViewHolder(int index)
{
foreach (var viewHolder in viewHolders)
{
if (viewHolder.Index == index)
{
return viewHolder;
}
}
2025-04-01 15:21:02 +08:00
2025-03-12 20:59:12 +08:00
return null;
}
/// <summary>
/// 根据数据的下标获取 ViewHolder 的下标
/// </summary>
/// <param name="index">数据的下标</param>
/// <returns></returns>
public int GetViewHolderIndex(int index)
{
for (int i = 0; i < viewHolders.Count; i++)
{
if (viewHolders[i].Index == index)
{
return i;
}
}
2025-04-01 15:21:02 +08:00
2025-03-12 20:59:12 +08:00
return -1;
}
public void Clear()
{
foreach (var viewHolder in viewHolders)
{
Free(viewHolder.Name, viewHolder);
}
2025-04-01 15:21:02 +08:00
2025-03-12 20:59:12 +08:00
viewHolders.Clear();
}
/// <summary>
/// 计算 ViewHolder 的尺寸
/// </summary>
/// <param name="index"></param>
/// <returns></returns>
public Vector2 CalculateViewSize(int index)
{
Vector2 size = GetTemplate(Adapter.GetViewName(index)).SizeDelta;
return size;
}
public int GetItemCount()
{
return Adapter == null ? 0 : Adapter.GetItemCount();
}
2025-04-01 15:21:02 +08:00
public void Dispose()
{
foreach (var viewHolder in viewHolders)
{
Free(viewHolder.Name, viewHolder);
ViewHolderObjectPool.Release(viewHolder);
}
viewHolders.Clear();
}
2025-03-12 20:59:12 +08:00
}
}