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

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

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

相关推荐
Hello_Embed2 小时前
STM32HAL 快速入门(二十):UART 中断改进 —— 环形缓冲区解决数据丢失
笔记·stm32·单片机·学习·嵌入式软件
咸甜适中3 小时前
rust语言 (1.88) 学习笔记:客户端和服务器端同在一个项目中
笔记·学习·rust
Magnetic_h4 小时前
【iOS】设计模式复习
笔记·学习·ios·设计模式·objective-c·cocoa
研梦非凡4 小时前
ICCV 2025|从粗到细:用于高效3D高斯溅射的可学习离散小波变换
人工智能·深度学习·学习·3d
limengshi1383925 小时前
机器学习面试:请介绍几种常用的学习率衰减方式
人工智能·学习·机器学习
知识分享小能手5 小时前
React学习教程,从入门到精通,React 组件核心语法知识点详解(类组件体系)(19)
前端·javascript·vue.js·学习·react.js·react·anti-design-vue
周周记笔记7 小时前
学习笔记:第一个Python程序
笔记·学习
优雅鹅7 小时前
ARM、AArch64、amd64、x86_64、x86有什么区别?
arm开发·学习
..过云雨7 小时前
05.【Linux系统编程】进程(冯诺依曼体系结构、进程概念、进程状态(注意僵尸和孤儿)、进程优先级、进程切换和调度)
linux·笔记·学习
咸甜适中7 小时前
rust语言 (1.88) egui (0.32.2) 学习笔记(逐行注释)(二十八)使用图片控件显示图片
笔记·学习·rust·egui