217 lines
8.1 KiB
C#
217 lines
8.1 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
|
|
namespace AlicizaX.UI
|
|
{
|
|
/// <summary>
|
|
/// 封装 RecyclerView 与 Adapter 的通用列表基类。
|
|
/// </summary>
|
|
/// <typeparam name="TData">列表数据类型。</typeparam>
|
|
/// <typeparam name="TAdapter">适配器类型。</typeparam>
|
|
public abstract class UGListBase<TData, TAdapter> where TAdapter : Adapter<TData> where TData : ISimpleViewData
|
|
{
|
|
/// <summary>
|
|
/// 关联的 RecyclerView 实例。
|
|
/// </summary>
|
|
protected readonly RecyclerView _recyclerView;
|
|
|
|
/// <summary>
|
|
/// 当前列表使用的适配器实例。
|
|
/// </summary>
|
|
protected readonly TAdapter _adapter;
|
|
|
|
/// <summary>
|
|
/// 获取当前绑定的 RecyclerView。
|
|
/// </summary>
|
|
public RecyclerView RecyclerView => _recyclerView;
|
|
|
|
/// <summary>
|
|
/// 初始化列表封装并将适配器绑定到 RecyclerView。
|
|
/// </summary>
|
|
/// <param name="recyclerView">目标 RecyclerView。</param>
|
|
/// <param name="adapter">用于驱动列表渲染的适配器。</param>
|
|
public UGListBase(RecyclerView recyclerView, TAdapter adapter)
|
|
{
|
|
_recyclerView = recyclerView;
|
|
_adapter = adapter;
|
|
|
|
if (_recyclerView != null)
|
|
{
|
|
_recyclerView.SetAdapter(_adapter);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取当前列表使用的适配器。
|
|
/// </summary>
|
|
public TAdapter Adapter => _adapter;
|
|
|
|
/// <summary>
|
|
/// 注册指定视图类型对应的 ItemRender。
|
|
/// </summary>
|
|
/// <typeparam name="TItemRender">ItemRender 类型。</typeparam>
|
|
/// <param name="viewName">视图名称;为空时表示默认视图。</param>
|
|
public void RegisterItemRender<TItemRender>(string viewName = "") where TItemRender : ItemRenderBase
|
|
{
|
|
_adapter.RegisterItemRender<TItemRender>(viewName);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 按运行时类型注册指定视图对应的 ItemRender。
|
|
/// </summary>
|
|
/// <param name="itemRenderType">ItemRender 的运行时类型。</param>
|
|
/// <param name="viewName">视图名称;为空时表示默认视图。</param>
|
|
public void RegisterItemRender(Type itemRenderType, string viewName = "")
|
|
{
|
|
_adapter.RegisterItemRender(itemRenderType, viewName);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 注销指定视图名称对应的 ItemRender 注册。
|
|
/// </summary>
|
|
/// <param name="viewName">视图名称;为空时表示默认视图。</param>
|
|
/// <returns>是否成功移除对应注册。</returns>
|
|
public bool UnregisterItemRender(string viewName = "")
|
|
{
|
|
return _adapter.UnregisterItemRender(viewName);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 清空当前列表的全部 ItemRender 注册信息。
|
|
/// </summary>
|
|
public void ClearItemRenderRegistrations()
|
|
{
|
|
_adapter.ClearItemRenderRegistrations();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 当前持有的数据集合引用。
|
|
/// </summary>
|
|
private List<TData> _datas;
|
|
|
|
/// <summary>
|
|
/// 获取或设置当前列表数据。
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// 设置数据时会同步调用适配器刷新列表内容。
|
|
/// </remarks>
|
|
public List<TData> Data
|
|
{
|
|
get => _datas;
|
|
set
|
|
{
|
|
_datas = value;
|
|
_adapter.SetList(_datas);
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 提供单模板列表的便捷封装。
|
|
/// </summary>
|
|
/// <typeparam name="TData">列表数据类型。</typeparam>
|
|
public class UGList<TData> : UGListBase<TData, Adapter<TData>> where TData : ISimpleViewData
|
|
{
|
|
/// <summary>
|
|
/// 初始化单模板列表。
|
|
/// </summary>
|
|
/// <param name="recyclerView">目标 RecyclerView。</param>
|
|
public UGList(RecyclerView recyclerView)
|
|
: base(recyclerView, new Adapter<TData>(recyclerView))
|
|
{
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 提供分组列表的便捷封装。
|
|
/// </summary>
|
|
/// <typeparam name="TData">分组列表数据类型。</typeparam>
|
|
public class UGGroupList<TData> : UGListBase<TData, GroupAdapter<TData>> where TData : class, IGroupViewData, new()
|
|
{
|
|
/// <summary>
|
|
/// 初始化分组列表。
|
|
/// </summary>
|
|
/// <param name="recyclerView">目标 RecyclerView。</param>
|
|
/// <param name="groupViewName">分组头使用的模板名称。</param>
|
|
public UGGroupList(RecyclerView recyclerView, string groupViewName)
|
|
: base(recyclerView, new GroupAdapter<TData>(recyclerView, groupViewName))
|
|
{
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 提供循环列表的便捷封装。
|
|
/// </summary>
|
|
/// <typeparam name="TData">循环列表数据类型。</typeparam>
|
|
public class UGLoopList<TData> : UGListBase<TData, LoopAdapter<TData>> where TData : ISimpleViewData, new()
|
|
{
|
|
/// <summary>
|
|
/// 初始化循环列表。
|
|
/// </summary>
|
|
/// <param name="recyclerView">目标 RecyclerView。</param>
|
|
public UGLoopList(RecyclerView recyclerView)
|
|
: base(recyclerView, new LoopAdapter<TData>(recyclerView))
|
|
{
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 提供多模板列表的便捷封装。
|
|
/// </summary>
|
|
/// <typeparam name="TData">多模板列表数据类型。</typeparam>
|
|
public class UGMixedList<TData> : UGListBase<TData, MixedAdapter<TData>> where TData : IMixedViewData
|
|
{
|
|
/// <summary>
|
|
/// 初始化多模板列表。
|
|
/// </summary>
|
|
/// <param name="recyclerView">目标 RecyclerView。</param>
|
|
public UGMixedList(RecyclerView recyclerView)
|
|
: base(recyclerView, new MixedAdapter<TData>(recyclerView))
|
|
{
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 提供常用 UGList 类型的快速创建方法。
|
|
/// </summary>
|
|
public static class UGListCreateHelper
|
|
{
|
|
/// <summary>
|
|
/// 创建单模板列表封装。
|
|
/// </summary>
|
|
/// <typeparam name="TData">列表数据类型。</typeparam>
|
|
/// <param name="recyclerView">目标 RecyclerView。</param>
|
|
/// <returns>创建后的单模板列表实例。</returns>
|
|
public static UGList<TData> Create<TData>(RecyclerView recyclerView) where TData : ISimpleViewData
|
|
=> new UGList<TData>(recyclerView);
|
|
|
|
/// <summary>
|
|
/// 创建分组列表封装。
|
|
/// </summary>
|
|
/// <typeparam name="TData">分组列表数据类型。</typeparam>
|
|
/// <param name="recyclerView">目标 RecyclerView。</param>
|
|
/// <param name="groupViewName">分组头使用的模板名称。</param>
|
|
/// <returns>创建后的分组列表实例。</returns>
|
|
public static UGGroupList<TData> CreateGroup<TData>(RecyclerView recyclerView, string groupViewName) where TData : class, IGroupViewData, new()
|
|
=> new UGGroupList<TData>(recyclerView, groupViewName);
|
|
|
|
/// <summary>
|
|
/// 创建循环列表封装。
|
|
/// </summary>
|
|
/// <typeparam name="TData">循环列表数据类型。</typeparam>
|
|
/// <param name="recyclerView">目标 RecyclerView。</param>
|
|
/// <returns>创建后的循环列表实例。</returns>
|
|
public static UGLoopList<TData> CreateLoop<TData>(RecyclerView recyclerView) where TData : ISimpleViewData, new()
|
|
=> new UGLoopList<TData>(recyclerView);
|
|
|
|
/// <summary>
|
|
/// 创建多模板列表封装。
|
|
/// </summary>
|
|
/// <typeparam name="TData">多模板列表数据类型。</typeparam>
|
|
/// <param name="recyclerView">目标 RecyclerView。</param>
|
|
/// <returns>创建后的多模板列表实例。</returns>
|
|
public static UGMixedList<TData> CreateMixed<TData>(RecyclerView recyclerView) where TData : IMixedViewData
|
|
=> new UGMixedList<TData>(recyclerView);
|
|
}
|
|
}
|