获取主页数据并显示流程笔记

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();
}

这个方法通过传入要更新列表的索引,就可以更新指定索引的数据。这样就可以将数据显示在列表视图中了

相关推荐
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码5 天前
嵌入式学习路线
学习
毛小茛5 天前
计算机系统概论——校验码
学习
babe小鑫5 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms5 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下5 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。5 天前
2026.2.25监控学习
学习
im_AMBER5 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J5 天前
从“Hello World“ 开始 C++
c语言·c++·学习