115 lines
3.1 KiB
C#
115 lines
3.1 KiB
C#
using System;
|
|
using AlicizaX.UI.Extension;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
|
|
namespace AlicizaX.UI
|
|
{
|
|
/// <summary>
|
|
/// 视图持有者基类,用于缓存和复用列表项视图
|
|
/// </summary>
|
|
public abstract class ViewHolder : MonoBehaviour
|
|
{
|
|
private RectTransform rectTransform;
|
|
|
|
/// <summary>
|
|
/// 获取 RectTransform 组件
|
|
/// </summary>
|
|
public RectTransform RectTransform
|
|
{
|
|
get
|
|
{
|
|
if (rectTransform == null)
|
|
{
|
|
rectTransform = GetComponent<RectTransform>();
|
|
}
|
|
|
|
return rectTransform;
|
|
}
|
|
private set { rectTransform = value; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// 视图名称,用于区分不同类型的视图
|
|
/// </summary>
|
|
public string Name { get; internal set; }
|
|
|
|
/// <summary>
|
|
/// 当前绑定的数据索引
|
|
/// </summary>
|
|
public int Index { get; internal set; }
|
|
|
|
/// <summary>
|
|
/// 选中状态
|
|
/// </summary>
|
|
public bool ChoiseState { private set; get; }
|
|
|
|
/// <summary>
|
|
/// 获取视图的尺寸
|
|
/// </summary>
|
|
public Vector2 SizeDelta => RectTransform.sizeDelta;
|
|
|
|
private IButton _button;
|
|
|
|
/// <summary>
|
|
/// 视图首次创建时调用
|
|
/// </summary>
|
|
protected internal virtual void OnStart()
|
|
{
|
|
}
|
|
|
|
/// <summary>
|
|
/// 视图被回收到对象池时调用
|
|
/// </summary>
|
|
protected internal virtual void OnRecycled()
|
|
{
|
|
}
|
|
|
|
/// <summary>
|
|
/// 绑定视图数据(抽象方法,子类必须实现)
|
|
/// </summary>
|
|
/// <typeparam name="T">数据类型</typeparam>
|
|
/// <param name="data">要绑定的数据</param>
|
|
public abstract void BindViewData<T>(T data);
|
|
|
|
/// <summary>
|
|
/// 绑定列表项点击事件
|
|
/// </summary>
|
|
/// <typeparam name="T">数据类型</typeparam>
|
|
/// <param name="data">数据对象</param>
|
|
/// <param name="action">点击回调</param>
|
|
protected internal virtual void BindItemClick<T>(T data, Action<T> action)
|
|
{
|
|
if (_button is null && !TryGetComponent(out _button))
|
|
{
|
|
Log.Warning("找不到Button组件");
|
|
return;
|
|
}
|
|
|
|
_button.onClick.RemoveAllListeners();
|
|
_button.onClick.AddListener(() => action?.Invoke(data));
|
|
}
|
|
|
|
/// <summary>
|
|
/// 绑定选中状态
|
|
/// </summary>
|
|
/// <param name="state">是否选中</param>
|
|
protected internal void BindChoiceState(bool state)
|
|
{
|
|
if (ChoiseState != state)
|
|
{
|
|
ChoiseState = state;
|
|
OnBindChoiceState(state);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 选中状态改变时的回调(可在子类中重写)
|
|
/// </summary>
|
|
/// <param name="state">是否选中</param>
|
|
protected internal virtual void OnBindChoiceState(bool state)
|
|
{
|
|
}
|
|
}
|
|
}
|