UE4-ListView

UE4ListView和U3D的思路不太一样,详细了解之后发现UE4的ListView还是蛮先进的,直接就实现了逻辑和显示分离,提高效率,相对的,他的用法也比Unity的ListView绕一些。举例,一个ListView如果设置12个Entry,那么它最多同时可以显示12个UI条目,假如你有30个数据,这30个数据是逻辑部分,不会为你创建30个Entry,那样太浪费了,而是循环利用这12个Entry显示,十分环保。当然30个数据似乎差异不大,那么当你有1000条数据的时候,优势就十分明显了。

这里要注意几个概念。

ListView,可以视为容器。

Entry,可以视为ListViewItem的显示部分,他负责实时的和逻辑绑定。Entry本身是一个Widget,要继承UseObjectListEntry接口。

逻辑部分,自己建立一个继承自Object的数据载体就好,它通常是【数据源】的集合。

1-首先构建ListView的Entry

新建UI蓝图,取名字为ListEntryItem

设计Entry。切换到Graph,打开ClassSettings,添加UseObjectListEntry接口。

2-构建ListView

新建UI蓝图,取名字ListUI

设置UpgradeList的Entry,为刚才我们创建的ListEntryItem

3-创建数据载体

Object蓝图,添加3个字段

ItemContent Text类型

IsSelect Bool型

CachedIndex Int型,这个纯是为了Debug方便加的,没有也行。

4-事件触发顺序

先讲一下事件触发顺序,和特殊规则。否则以后遇到坑的时候都不知道自己为什么被坑。

打开页面时触发:

ListUI的事件

首先触发的是LsitUI的EventConstruct。当成构造函数就好。

ListEntryItem的事件

当你向ListUI填数据的时候,ListView会判断这个数据是否需要显示,如果需要显示,就会创建Entry(或回收再利用Entry)并触发这个事件。

当你选择其他的物件时

先调用失去焦点的ListEntryItem物件的

ListEntryItem的事件

再调用获得焦点的ListEntryItem物件的

最后调用容器,也就是ListView的

ListUI的事件

然后还需要注意的是

当你拖动ListView,使得Entry代表的数据Object发生变化时,也会调用

ListEntryItem的

事件,这很好理解,当Entry循环利用的时候,Entry肯定会切换数据Object,那么想要显示新的数据内容,肯定也要触发一次数据绑定事件。

4 三个坑

这三个坑其实是源于ListView自身的机制。但是理解其原理之后,就能绕过这些坑。

为什么要先讲这个呢,这时因为使用ListView有3个坑。

第一个坑:数据和状态都不能存到Entry上,Entry应该只负责显示,最多持有一个当前数据Object的一个引用。否则,一个100个Item和10个Entry的ListView,每个Entry要被10个Item用,如果你把状态,比如选中状态存再Entry上面,那么当你改变一个Entry状态的时候,10个数据Item都会发生异变。比如你选择1号Entry,那么11,21,31...都会发生相同的变化。

第二个坑:我们打个比方,比如一个数据Object正在被一个Entry显示,我们说他为【上班】状态,否则,说他是【下班】状态。一个Entry,滑动ListView将其划走,这时候Entry的对应的数据Object,就会下班。而如果这个数据Object下班了,也就说明他不再和Entry关联,那么你理所当然的,不能指望依靠Entry里面的

事件去改变这个处于下班状态的数据Object的IsSelect状态。所以,你需要编辑ListView的

事件,并缓存一个【上一个选择的数据Item】的引用。

第三个坑:第一次选择不同的Entry的时候,不会为当前的Entry调用Select事件。只有第二次点击Entry的时候,才会调用上一个Entry的EventOnItemSelectionChanged,并再其后调用新选择目标的EventOnItemSelectionChanged。这样有些时候,第一个Entry如果被设为默认选中状态,他就没法被正常取消了。

5-使用ListView的一种思路

1 构造ListView

功能简单明了

循环30次,将所有数据添加给ListView。用字符串+索引作为其显示数据。同时将索引存入CacchedIndex

2 设置Entry数据的函数,这里只设置text。因为索引是不变的。

3 为ListEntryItem添加 UpdateView函数

用来更新ListView显示状态

4 选择焦点变化处理

当选择发生变化时为新被选择的物件,添加事件设置其选择状态。如果一个数据恰好也被Entry绑定并显示出来,同时触发取消选择状态的Entry的这个事件,将其改成不显示状态。

5 后台变更数据Object选中状态

如果一个数据Object没被显示出来,Entry的事件是处理不了它的,那么这时候就要ListView亲自出马了。

判断当前缓存的物件,是不是和当前选中物件一致,如果是,先把当前缓存物件的isSelect设False,然后将其作为新的缓存物件保存起来。

最终效果:

只能选中一个物件,并且上下滑的时候状态不会错乱。

PS:如果实在整不明白,那就让Entry的数量==数据对象的数量吧,那样是没有坑的,因为一个Entry和一个数绑定并且不会切换,但是效率问题就自己想办法吧。

UE4 ListView相关推荐

  1. [UE4] UI部分

    [UE4] UI部分 UMG基础 蓝图 几点思考 UMG和C++交互 UI基础控件和自定义控件 基础控件 自定义控件 3D UI UI适配 优化 UI开发示例 UI对话事件 SVN进行UE4项目协作 ...

  2. Android ListView 点击item改变item的背景颜色(ListView实现光标移动)

    一下demo 地址 实现的效果图如下 ListView 光标移动,实现很是简单,这里是指item背景的改变 使用 listSelector listSelector  用户指定当前选中item 的颜色 ...

  3. Android ListView 删除 item

    实现效果 主要使用方法 是, remove 之后在刷新界面 adapter 里面的代码 public class MyAdapter extends BaseAdapter {private List ...

  4. ListView 添加头部 和尾部 布局 (addHeaderView 和 addFooterView)

    ListView 添加头部 和尾部 布局  其实很简单 ,listview 暴露的有方法addHeaderView 和 addFooterView 从源码里面可以看到, addHeaderView 和 ...

  5. Android ListView item设置分割线以及分割线宽度

    ListView item设置分割线的方法:setDivider ListView item设置分割线宽度的方法:setDividerHeight // 设置分割线 listView.setDivid ...

  6. Android ListView (多个adapter 说明)

    最近维护项目,项目里面使用的都是ListView 这里也对ListView 回顾一下 以下 demo 地址 ListView 在Android 里面用来实现列表的, 在xml 中创建ListView ...

  7. 玩转android自定义控件二——自定义索引栏listview

    带索引栏的listview,在android开发非常普遍,方便用户进行字母索引,就像微信通讯录这样: 今天,我们就从零到一实现这个具有索引栏的listview. 怎么实现这个控件了,我们应当梳理出一个 ...

  8. ListView style

    步骤一:在使用的ListView的activiey里使用android:theme="@style/Theme的名字" 步骤二:创建Themes.xml 在Themes.xml里定 ...

  9. ue4 4.24启动无响应_UE4项目问题集合

    debugeditor模式下,在LoadPackage过程中crash,vs报出Stack overflow的错误 这是由于Package层数过多,vs栈不够用导致的.而ue4用UBT导致不能直接修改 ...

最新文章

  1. 2011年7月28日星期四精彩网语
  2. 产品「工具人」如何破局?
  3. Electron如何调用NodeJS扩展模块
  4. em模型补缺失值_模型对缺失值的处理
  5. iOS 快速实现分页界面的搭建
  6. 96. Unique Binary Search Trees1和2
  7. php static_castunsigned int,static_cast揭密
  8. 60秒一口Python:147个demo,助你从新手小白步步进阶编程高手,赶紧收藏!!
  9. 从安装到部署的Cordova iOS应用开发说明
  10. matlab求导赋值,MATLAB 函数先求导再赋值
  11. java4.25生成车牌号_泸牌16年涨882倍 超25万人拍一张车牌为哪般?
  12. macOS Monterey 12.2 (21D49) 虚拟机 IOS 镜像
  13. autojs 捕获异常并处理
  14. python爬取网易云音乐百强榜单
  15. 【老卫搞机】136期:华为开发者联盟社区2022年度战码先锋2期开源贡献之星
  16. winform遍历bartender_C# 调用Bartender服务并打印bartender标签
  17. [转帖]《今日用友》:封闭的“苹果”
  18. 学习笔记-公有云安全
  19. 在cdlinux下装无线网卡驱动的解决方法
  20. 【fcgi如何处理http post上传文件】

热门文章

  1. 【测试基础】软件测试用例设计方法
  2. Bing地图切片原理
  3. 招聘程序员为什么大多要本科生,就算不是本专业也行吗?
  4. 谜一样的计算机科学之父,竟因同性恋致使职业生涯尽毁
  5. 书评Python神经网络编程——相当友好的入门书
  6. Lyapunov意义下的稳定性定义
  7. “如何避免总线错误或不可纠正的错误导致的宕机事件”之tolerant介绍
  8. Postman测试WCF接口
  9. c语言多个大括号的作用,c语言大括号怎么用
  10. 推送消息不打烊--Flutter集成个推SDK实现Android和IOS原生推送