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

我封装的是支持这种以及继承一个ListItem子类挂在item上 两种方式,用两年了还算好用
你好啊。。 最新有js版吗?
setDataSet 完应该去notify 一下.
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进行相关操作.
移动到第N个item要怎么写?
mark
public scrollToPage(pageIndex: number, pageCount?: number, timeSecond?: number);
没有单独写. 可以先用这个代替或者照搬代码自己写一个.
pageCount=1即可. 意思是每页只有一个元素. 这样pageIndex即=N
哪来的notifyDataSetChange()
ListView 中的方法.
有没有试过item节点弄复杂一点,滑动快的时候好像会空白
增加spawnCount 的数值即可.表示不可见区域会有多少个预缓存Item. 以应对快滑时的流畅性.

mark
大佬好,我使用了这个组件,我这边是垂直滚动的多行3列,显示上没有任何问题,但是拿到真机上发现往下滚动的时候drawcall会不断增加,于是我加了日志看了下,发现updateView方法里面let child = this._filledIds[i] || this._items.get() || cc.instantiate(this.itemTemplate);这一行代码的位置,实际上是往下滑动的时候会不断调用到cc.instantiate方法,如果一直往下滑动就会一直调用。我理解的是item是复用的,如果往下滚动的时候不应该还继续调用cc.instantiate方法。不知道是我调用的方式不正确还是怎么的。求助大佬了。
非常感谢,多行显示确实有问题, 可见区索引计算缺少多行考虑.
修复方法:
// 获取当前屏幕可见元素索引.
private getVisibleRange(): number[] {
…
**_
return [startIndex * this.column, visible];
_**
startIndex 乘以 this.column 即可.
测试OK:
Mrak
好的,谢谢大佬,修改之后拿到真机测试,drawcall正常了。很实用的组件。
这个经常滚动着就空白了,尤其切换数据时。
