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

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

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

相关推荐
云边散步2 小时前
godot2D游戏教程系列二(4)
笔记·学习·游戏开发
jrlong2 小时前
DataWhale大模型基础与量化微调task4学习笔记(第 2 章:高级微调技术_RLHF 技术详解)
笔记·学习
Darkershadow2 小时前
蓝牙学习之Time Set
python·学习·蓝牙·ble·mesh
好奇龙猫2 小时前
【日语学习-日语知识点小记-日本語体系構造-JLPT-N2前期阶段-第一阶段(9):単語文法】
学习
AI浩3 小时前
约束模型下的目标检测置信学习
学习·目标检测·目标跟踪
m0_748229993 小时前
ThinkPHP快速入门:从零到实战
c语言·开发语言·数据库·学习
風清掦3 小时前
【江科大STM32学习笔记-04】0.96寸OLED显示屏
笔记·stm32·学习
胡西风_foxww3 小时前
ObsidianAI_学习一个陌生知识领域_建立学习路径和知识库框架_写一本书
人工智能·笔记·学习·知识库·obsidian·notebooklm·写一本书
Haooog3 小时前
AI应用代码生成平台
java·学习·大模型·langchain4j
非凡ghost3 小时前
ShareX(免费截图录屏软件)
windows·学习·软件需求