UMG ListView的使用方法。Item 与Entry的概念,极其诡异。抓耳挠腮

新建一个ListView,需要填入这个

这个表示显示出来的控件长什么样。点个加号创建一个。

这个就是Entry。Entry就是显示在界面上的控件。

怎么往ListView中添加Entry?

ListView并没有AddEntry这个API,只有AddItem这个API。

那么什么是Item?Item就是Entry的数据载体,是一个UObject,让我抓耳挠腮的点就是这个,我试图创建一个控件,然后传进去AddItem。但是什么都没有发生!甚至不知从何调试。

正确做法是,创建一个蓝图,用来当数据载体(非常诡异,为什么数据载体不是一个结构体之类的。或者DataTable.)。

我创建了这个继承于UObejct的类,然后在里面放进我要传给Entry的数据。

然后AddItem时构建这个类。

还还还有最后一步,Entry中实现了这个接口(UserObjectListEntry)

需要实现OnListItemObjectSet函数,在AddItem后,这个函数会被调用。需要手动将传过来的Item中的数据,赋值给Entry.

这样才才才才才算完事了。。。。。坑坑坑坑啊啊啊啊啊啊!!!!!!

------------------------------------------------------网上大部分内容教以上的东西-----------------------------------

如何定制Hovered样式和选中样式,像一个按钮一样。并且点击后能访问Item来执行逻辑。

ListView中有“点击项目时”事件,点击一个Entry时,会给出对应的Item

可以用这个事件来访问Item,并输出Item里的信息。

至于样式,第一时间想到在Entry中添加一个Button,于是踩了第一个坑:点击时Button的OnClicked消耗了输入事件导致ListView的“点击项目时”事件不触发。

随后移除了Button。手动实现样式。(为什么这种事要我自己造轮子,没道理的。是不是我我不知道什么API啊?)

创建Selected变量和Hovered变量记录下当前的控件状态。然后根据状态来调整样式。

悬停样式通过Entry的OnMouseEnter和OnMouseLeave事件实现

选中样式通过UserObjectListEntry接口中的OnItemSelectionChanged

做到这里已经能实现单选,但是一旦出现了滚动条,就会出现第二个坑:随便选中一个Entry,滚动到下方,就会发现另一个Entry被莫名其妙地选中了

知乎大佬说是这俩Entry其实是同一个被复用了。ItemList并不会为每个Item创建一个Entry,Item通常是非常多的,那样的话Entry肯定会把内存挤爆。看评论区说是只要在EntryReleased被调用的时候把样式设置为未选中就行了。原理未知,懒得探究,出bug再说。

[UE4蓝图]UMG中新手必晕的ListView详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值