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

65 lines
1.9 KiB
C#
Raw Permalink Normal View History

2025-03-12 20:59:12 +08:00
using System;
using System.Collections.Generic;
using System.Linq;
2025-05-28 19:37:38 +08:00
using SimpleObjectPool;
2025-03-12 20:59:12 +08:00
using UnityEngine;
namespace AlicizaX.UI.RecyclerView
{
public class MixedViewProvider : ViewProvider
{
[SerializeField] private ViewHolder chatLeftViewHolder;
[SerializeField] private ViewHolder chatRightViewHolder;
2025-05-28 19:37:38 +08:00
private IMixedObjectPool<ViewHolder> objectPool;
2025-03-12 20:59:12 +08:00
private Dictionary<string, ViewHolder> dict = new();
public MixedViewProvider(RecyclerView recyclerView, ViewHolder[] templates) : base(recyclerView, templates)
{
foreach (var template in templates)
{
dict[template.name] = template;
}
2025-05-28 19:37:38 +08:00
UnityMixedComponentFactory<ViewHolder> factory = new(dict, recyclerView.Content);
objectPool = new MixedObjectPool<ViewHolder>(factory);
2025-03-12 20:59:12 +08:00
}
public override ViewHolder GetTemplate(string viewName)
{
if (templates == null || templates.Length == 0)
{
throw new NullReferenceException("ViewProvider templates can not null or empty.");
}
return dict[viewName];
}
public override ViewHolder[] GetTemplates()
{
if (templates == null || templates.Length == 0)
{
throw new NullReferenceException("ViewProvider templates can not null or empty.");
}
return dict.Values.ToArray();
}
public override ViewHolder Allocate(string viewName)
{
2025-05-28 19:37:38 +08:00
var viewHolder = objectPool.Allocate(viewName);
viewHolder.gameObject.SetActive(true);
return viewHolder;
2025-03-12 20:59:12 +08:00
}
public override void Free(string viewName, ViewHolder viewHolder)
{
2025-05-28 19:37:38 +08:00
objectPool.Free(viewName, viewHolder);
2025-03-12 20:59:12 +08:00
}
public override void Reset()
{
Clear();
2025-05-28 19:37:38 +08:00
objectPool.Dispose();
2025-03-12 20:59:12 +08:00
}
}
}