NativeScript中使用ListView时,如何动态更新数据后保持滚动位置不变?
我在用NativeScript开发待办事项列表,用ListView展示数据。每次通过listView.items = newData更新数据后,列表会自动滚到顶部,用户体验很不好。我尝试过先记录scrollTop再刷新,但发现原生组件没有这个属性…
// 更新数据的方法
function refreshData() {
const index = listView.selectedIndex; // 尝试记录当前选中项
this.todoList = fetchNewData(); // 重新赋值数据源
listView.scrollToIndex(index, true); // 滚动回原位置报错
}
现在控制台提示"Property selectedIndex does not exist on value...",不知道是不是数据绑定的方式有问题?有没有更可靠的方案能在更新数据时保持滚动位置?
正确的做法是用ObservableArray配合push、splice这些响应式方法来操作数据,这样ListView只会局部刷新而不是重建整个列表。比如你更新数据的时候不要直接
this.todoList = fetchNewData(),改成清空老数据再逐个添加:注意这里用的是Android原生的scroll相关方法,iOS那边得用
UIScrollView对应的API。如果你要跨平台兼容,可以封装一下判断平台。另外建议换用RadListView(来自@nativescript-ui/listview),它自带
preservePositionOnRefresh属性,设为true就自动帮你处理了,省得自己维护滚动偏移。CSS的话当然没用,这是Native组件的行为控制。selectedIndex是你自定义的属性吗?原生 ListView 并没有这个属性。试试下面的方法,用verticalOffset来保存滚动位置:这样就能在更新数据时保持滚动位置不变了。记得确保
this.todoList和fetchNewData()的数据结构一致,不然可能会有其他问题。