新建一个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再说。