我有一个由BaseAdapter提供数据的列表视图。
当数据发生变化时,我调用BaseAdapter.notifyDataSetChanged。一切都很好。
现在我想知道,如果我更改某个列表项中的一些细节,是否有优化的方法可以更新单个已显示在屏幕上的项目的视图? 我认为如果项目发生了微小的更改,notifyDataSetChanged会盲目地重新构建所有可见项目的视图,这不是最优的。
我有一个由BaseAdapter提供数据的列表视图。
当数据发生变化时,我调用BaseAdapter.notifyDataSetChanged。一切都很好。
现在我想知道,如果我更改某个列表项中的一些细节,是否有优化的方法可以更新单个已显示在屏幕上的项目的视图? 我认为如果项目发生了微小的更改,notifyDataSetChanged会盲目地重新构建所有可见项目的视图,这不是最优的。
不,除非您实现自己的ListView
类扩展,否则我认为这是不可能的。
这里有setAdapter()
的源代码。
您会发现,ListView
仅使用mAdapter.registerDataSetObserver(mDataSetObserver);
将自身注册为观察者。而DataSetObserver
无法提供通知特定位置更改的方法。
然而,可能没有必要通知某些项的更新,因为据我所知,ListView
仅呈现和更新当前屏幕上看到的项目,因此在这里不需要进行优化。
是的,有方法。假设我可以识别列表项,例如通过为其分配View.setTag到某个值,我可以迭代列表项并重新绑定只有一个列表项(如果需要),甚至只更新项的某些子视图。
这很简单且相对便宜(线性搜索):
for(int i = list.getChildCount(); --i>=0; ){
View v = list.getChildAt(i);
Object id = v.getTag();
if(id==myId){
updateListItem(id, v);
break;
}
}
其中myId是我想要更新的项目的某个ID,而updateListItem会对列表项进行所需的更改。经过证明,工作良好且非常高效。