UE4 ListView

article/2025/9/25 15:00:23

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和一个数绑定并且不会切换,但是效率问题就自己想办法吧。


http://chatgpt.dhexx.cn/article/l4ryRa4e.shtml

相关文章

Android 控件 —— ListView

ListView 的简单用法 在布局中加入 ListView 控件还算简单&#xff0c;先为 ListView 指定一个 id&#xff0c;然后将宽度和高度都设置为 match_parent&#xff0c;这样 ListView 就占满了整个布局的空间 <LinearLayout xmlns:android"http://schemas.android.com/ap…

ListView 组件

简介&#xff1a; ListView是最常用的可滚动组件之一 有三种构建方式&#xff1a; ListViewListView.builderListView.separated 主要参数说明&#xff1a; scrollDirection: Axis.horizontal 水平列表Axis.vertical 垂直列表 padding: 内边距 resolve: 组件反向排序 childr…

4.ListView

ListView 文章目录 ListView一、什么是ListView二、ListView入门1.ListView核心类2.代码编写步骤 三、ListView优化四、把复杂界面(通过xml文件实现)显示到ListView上1.View的静态方法2.获取LayoutInflater对象 五、SimpleAdapter & ArrayAdapter的使用1.ArrayAdapter2.Sim…

ListView及ListAdapter详解

ListView及ListAdapter详解 一、AdapterView 1. 简介 An AdapterView is a view whose children are determined by an Adapter. 简单地说就是其子视图是由适配器决定的视图组件 2. 子类 ListViewGridViewSpinnerGallery3. 常用方法 //功能:获取list中指定位置item get…

qt listview

运行图 .h #ifndef WIDGET_H #define WIDGET_H#include <QWidget>#include <QStringListModel> #include <QModelIndex>namespace Ui { class Widget; }class Widget : public QWidget {Q_OBJECTpublic:explicit Widget(QWidget *parent 0);~Widget();pri…

flutter 之 ListView的使用与详解 map for listview.builder 的使用

1.ListView 配合ListTile 实现新闻列表样式 ListView(children: <Widget>[ListTile(title: const Text(我是 title),subtitle: const Text(我是 sub_title),leading: Image.asset(images/c.png,fit: BoxFit.cover,),trailing: const Icon(Icons.chevron_right,size: 22,…

android ListView

android ListView几个比较特别的属性 由于这两天在做listView的东西&#xff0c;所以整理出来一些我个人认为比较特别的属性&#xff0c;通过设置这样的属性可以做出更加美观的列表 首先是stackFromBottom属性&#xff0c;这只该属性之后你做好的列表就会显示你列表的最下面&am…

ListView使用总结

ListView使用总结 虽然随着RecyclerView的不断普及&#xff0c;相应的资源也越来越多&#xff0c;许多的项目都在使用RecyclerView&#xff0c;但作为他的前辈ListView&#xff0c;加深对ListView的使用有助于我们更好的适应到RecyclerView的使用中。 首先看一下我们实现的效…

Android有关ListView嵌套ListView的一些问题

本人在做评论回复功能的时候&#xff0c;查阅到ListView结合Adapter适配器具有以列表的形式 展示具体数据内容&#xff0c;并且能够根据数据的长度自适应屏幕显示的功能&#xff0c;因此打算在ListView中嵌套ListView完成点击事件后弹出输入框再输入数据后在下方显示回复内容&a…

ListView详解0

ListView常用方法总结 1、listview拖动变黑解决方法 在Android中&#xff0c;ListView是最常用的一个控件&#xff0c;在做UI设计的时候&#xff0c;很多人希望能够改变一下它的背景&#xff0c;使他能够符合整体的UI设计&#xff0c;改变背景背很简单只需要准备一张图片然后指…

C# ListView 的用法

ListView 是一种多列的列表视图控件&#xff0c;可以用于展示多个数据项及其相关信息。ListView 控件提供了丰富的属性和事件&#xff0c;可以用于实现各种各样的表格视图&#xff0c;包括带有单元格编辑、排序和分组等功能。 下面我们通过几个示例来演示如何使用 ListView 控…

Qt ListView使用

概述 Qt中ListView加载数据一般有两种方式&#xff0c;一种是直接qml文件中model直接定义并且放置数据&#xff0c;一种是C代码中定义Model&#xff0c;再setContextProperty的方式暴露给qml域。 步骤 &#xff08;1&#xff09;qml界面 import QtQuick 2.0 import QtQui…

Android控件listview ListView的用法

在Android开发中&#xff0c;ListView是一个比较常用的控件&#xff0c;它以列表的形式展示数据内容&#xff0c;并且能够根据列表的高度自适应屏幕显示。ListView的样式是由属性决定的&#xff0c;它的常用属性如下所示 android:listSelector 点击后改变背景颜色 android:divi…

Android之ListView实现

ListView 用来显示多个可滑动项&#xff08;Item&#xff09;列表的ViewGroup。 需要使用Adapter&#xff08;适配器&#xff09;将集合数据和每一个Item所对应的布局动态适配到ListView中显示 显示列表&#xff1a;listView.setAdapter(adapter) Adapter ArrayAdapter&#xf…

ListView使用方法

ListView使用方法总结 - 直接使用ListView组件创建列表 - 通过Activity继承ListActivity创建 - 定制ListView界面 直接使用ListView组件创建列表 通过数组资源文件指定列表项 先在XML布局文件中添加ListView标志&#xff0c;设置好相关属性&#xff1b;在values下创建数组资…

Android—— ListView 的简单用法及定制ListView界面

一、ListView的简单用法 2. 训练目标 1) 掌握 ListView 控件的使用 2) 掌握 Adapter 桥梁的作用 实现步骤&#xff1a; 1&#xff09;首先新建一个项目&#xff0c; 并让ADT 自动帮我们创建好活动。然后修改activity_main.xml 中的代码&#xff0c;如下所示&#xff1a; &…

QT listView学习

文章目录 listViewdemo说明demo演示model定义委托 QStyledItemDelegate总结 listView listView 对比 tableView 、 treeView来说&#xff0c;最大的不同就是数据结构的不同。treeView是像树一样的层次结构&#xff0c;而listView则就是像链表一样的结构 跟之前的treeView&…

还在用ListView?

还在用Lisview&#xff1f;RecyclerView都已经出来一年多了&#xff01; 想必大家多或多或少的接触过或者了解过RecyclerView&#xff0c;为什么没有用起来&#xff0c;原因大概如下&#xff1f; ListView我用的挺好的&#xff0c;为什么要换RecyclerView&#xff1f;ListView…

ListView用法

ListView是用于显示数据的&#xff0c;先在窗体中拉一个lisview控件&#xff0c;还有一些新增、修改、删除、查询按钮和文本框&#xff0c;控件名称为listview,按钮为btnInsert,btnUpate,btnDeleteOne,btnDelete,btnSelect,文本框的名称为txtName,txtSex,txtPhone,txtAddress,设…

ListView的基础用法

最近学到ListView和RecyclerView&#xff0c;感觉有点难理解&#xff0c;于是自己找到了篇文章&#xff0c;感觉写的挺详细的&#xff08;文章链接在文末&#xff09;&#xff0c;然后自己再整理敲了跑了一遍&#xff0c;总结了一下&#xff0c;方便自己以后回头温习。 一个Li…