我有一个由BaseAdapter提供的列表视图。
当数据发生变化时,我调用BaseAdapter.notifyDataSetChanged。一切正常。
现在我想知道,如果我更改某些列表项中的一些细节,是否有一些优化方式来更新单个项目的视图(如果它显示在屏幕上)? 我想notifyDataSetChanged会盲目地重建列表中所有可见项的视图,如果项目发生微不足道的改变,这不是最佳的。
答案 0 :(得分:1)
不,我想这是不可能的,除非你实现自己的ListView
类扩展。
这里有setAdapter()
的{{3}}。
您将看到,ListView
仅使用mAdapter.registerDataSetObserver(mDataSetObserver);
将自己注册为观察者
并且DataSetObserver
无法通知某个位置的变更。
然而,可能没有必要通知某些项目的更新,因为据我所知,ListView
仅呈现和更新当前在屏幕上看到的项目,因此,此处不需要进行优化。
答案 1 :(得分:0)
是的,有方法。假设我可以识别列表项,例如通过将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对列表项进行了所需的更改。事实证明,工作正常,非常有效。