贡献一个自定义ListView 实现, 高效复用机制以及便捷的使用接口

mark

正想自己造轮子。。。多谢分享

mark

recycleDirty() 就是在每帧里用于检测是否需要刷新元素的. 比如 t0 时刻 界面显示1-5 索引元素, t1 时刻进行了滚动操作,根据滚动偏移计算出需要显示 2-6元素, 则 recycleDirty 会对已隐藏的 索引1元素进行回收. 并记录当前视图区范围为2-6

git 有时间整一下.

@andrewlu 支持不同item宽度吗,支持多行或多列 吗

使用中 遇到一个问题, 延迟设置数据的话会导致列表无法滑动,Demo中也会复现,这是一个很常见的需求吧, 请求接口请求到数据才去setData(),

接口设计是参考安卓的listview吗?对于简单的列表感觉接口稍复杂,可以支持一下 只传一个callback来初始化item数据的方式。:yum:
使用的时候类似下面这样

1赞

我封装的是支持这种以及继承一个ListItem子类挂在item上 两种方式,用两年了还算好用

你好啊。。 最新有js版吗?

setDataSet 完应该去notify 一下.

mark…

mark

ListView.zip (3.7 KB)
最新版本的ListView 组件.
修复各种问题,重构实现方法.
支持横版/竖版/ 网格布局.
支持整屏翻页.

使用方法:
const adapter = new PlayerListAdapter(); adapter.setDataSet(gameData.players); this.playerList.setAdapter(adapter);
class PlayerListAdapter extends ListAdapter { public updateView(item: cc.Node, posIndex: number) { const comp = item.getComponent(PlayerInfoComp); comp.setInfo(this.getItem(posIndex)); } }
需要更新数据时, 调用adapter.setDataSet()/ 并调用 list.notifyDataSetChange()

翻页:
this.list.scrollToPage()
this.list.pager.nextPage()
this.list.pager.prePage()

也就是说, 他可以用来代替PageView进行相关操作.

1赞

移动到第N个item要怎么写?

mark

public scrollToPage(pageIndex: number, pageCount?: number, timeSecond?: number);
没有单独写. 可以先用这个代替或者照搬代码自己写一个.
pageCount=1即可. 意思是每页只有一个元素. 这样pageIndex即=N

哪来的notifyDataSetChange()

ListView 中的方法.

有没有试过item节点弄复杂一点,滑动快的时候好像会空白

增加spawnCount 的数值即可.表示不可见区域会有多少个预缓存Item. 以应对快滑时的流畅性.