1.定义了一个名为 MainViewListItemData 的类,用于存储主界面中每个列表项的数据。
public class MainViewListItemData
{
//名字
public string m_Name;
//描述
public string m_Desc;
//图片或者视频的url
public string m_Url;
//是否是小视频,
public bool m_IsMove;
//点赞数
public int m_StartCnt;
}
2.定义了一个名为 EventId 的枚举,用于标识各种事件的类型。增加一个主页列表更新的事件ID:HomeUpdateList。
这样的优点是:通过这样的枚举定义,可以方便地标识和管理不同类型的事件。
namespace WeiLai.Enum
{
public enum EventId
{
None,
#region Login System
LoginBegin = 1000,
LoginSucc,
LoginEnd = 1999,
HomeBegin = 7000,
HomeSucc,
HomeUpdateList,
HomeEnd = 7999
#endregion
}
}
3.需要用于创建和回收事件对象方法。
public static EmptyEvt Fetch(EventId evtId)
{
var evt = EventMgr.Inst.GetEvent<EmptyEvt>();
evt.EvtId = (int)evtId;
return evt;
}
这个方法获取一个特定类型的事件对象,其中参数 evtId 表示事件的标识符。
public override void OnRecyle()
{
EvtId = -1;
}
这个方法用于回收事件对象,Evtid 设置为 -1,表示该事件的对象已经被回收了。这样可以确保事件对象在被使用之前能被正确地重置,可以避免一些不必要的的数据混乱或错误。
4.在数据管理的脚本中声明一个字典
public Dictionary<int, List<MainViewListItemData>> m_MainViewListData;
这个字典用于存储主视图列表数据,其中键是整数类型,表示主视图列表的索引,值是一个列表,存储了 MainViewListItemData 类型的数据。这个MainViewListItemData是用于存放列表项的数据。
还要初始化这个m_MainViewListData
private void _InitMainViewListData()
{
m_MainViewListData = new Dictionary<int, List<MainViewListItemData>>(m_MainTitle.Length);
}
目的是在初始化阶段为 m_MainViewListData字段创建一个新的字典对象,并设置其大小。
5.需要一个用于获取特定标题索引的数据列表方法和一个用于更新主视图中特定标题的数据的方法
public List<MainViewListItemData> GetMainViewData(int tilteIndex)
{
List<MainViewListItemData> list;
if (!m_MainViewListData.TryGetValue(tilteIndex, out list))
{
list = new List<MainViewListItemData>();
m_MainViewListData.Add(tilteIndex, list);
}
return list;
}
这个方法的作用是获取特定标题索引的主视图数据列表,如果该索引对应的数据列表不存在,则创建一个新的列表并将其添加到字典中。
public void UpdateMainView(int tilteIndex, MainViewListItemData[] datas)
{
List<MainViewListItemData> list = GetMainViewData(tilteIndex);
foreach (var data in datas)
{
list.Add(data);
}
EventMgr.Inst.Broadcast(IntEvt.Fetch(EventId.HomeUpdateList, tilteIndex));
}
这个方法用于更新主视图中特定标题的数据,并通知事件管理器广播一个主视图更新的事件。
因此需要注册广播事件在注册后还需要反注册。
public override void Show()
{
base.Show();
EventMgr.Inst.Register(EventId.HomeUpdateList, _UpdateList);
}
当HomeUpdateList事件被触发时,就会调用_UpdateList方法
public override void UnShow()
{
EventMgr.Inst.UnRegister(EventId.HomeUpdateList, _UpdateList);
base.UnShow();
}
这样可以在界面隐藏时取消监听 HomeUpdateList 的事件,并移除 _UpdateList 方法。
其中的_UpdateList方法用于确保参数是正确的事件类型
private void _UpdateList(BaseEvent obj)
{
if (obj is IntEvt intEvt)
{
var titleIdx = intEvt.m_Value;
m_HomeView.UpdateList(titleIdx);
}
}
6.需要一个用于获取网络数据的方法,这里用模拟代替。
public void GetMainViewData(int titleIndex)
{
TimerMgr.Inst.AddTimer(1.0f, 1, () =>
{
MyLogger.Info($"on get main index = {titleIndex}");
var testData = new MainViewListItemData[Constant.m_MainViewEachRequestNum];
for (int i = 0; i < Constant.m_MainViewEachRequestNum; i++)
{
var data = new MainViewListItemData();
data.m_Name = "name" + i.ToString();
data.m_Desc = "desc" + i.ToString();
data.m_Url =
"https://img2.imgtp.com/2024/04/13/kk2byMrk.png";
testData[i] = data;
}
DataMgr.Inst.UpdateMainView(titleIndex, testData);
});
}
}
代码分析:
通过接受一个整数参数 titleIndex,这个代表数据的标题索引。通过定时器模拟获取数据,最后将获取到的标题索引和数据数组作为参数传递给 UpdateMainView 方法,用于更新主视图数据。
7.追后当拿到数据之后显示在列表视图中,因此需要一个更新列表视图的方法。
public void UpdateList(int titleIdx)
{
foreach (var dataList in DataMgr.Inst.GetMainViewData(titleIdx))
{
// 检查索引是否超出数组范围
if (i >=Constant.m_MainViewEachRequestNum)
{
i = 0;
}
if (i < m_numbers.Length && i < m_numbers2.Length)
{
m_numbers[i] = dataList.m_Name;
m_numbers2[i] = dataList.m_Url;
i++;
}
else
{
MyLogger.Info("i的大小:"+i+"m_numbers的长度:"+m_numbers.Length+"m_numbers2.Length的长度"+m_numbers2.Length);
return;
}
}
m_list2 = _mainView.GetChild("n19").asList;
m_list2.SetVirtual();//设置为虚方法
m_list2.itemRenderer = RenderListItem1;
m_list2.numItems = 50;
m_list2.RefreshVirtualList();
}
这个方法通过传入要更新列表的索引,就可以更新指定索引的数据。这样就可以将数据显示在列表视图中了