Listview + BaseAdapter - 如何通知单项的变更?

时间:2011-11-15 12:56:29

标签: android android-listview listadapter

我有一个由BaseAdapter提供的列表视图。

当数据发生变化时,我调用BaseAdapter.notifyDataSetChanged。一切正常。

现在我想知道,如果我更改某些列表项中的一些细节,是否有一些优化方式来更新单个项目的视图(如果它显示在屏幕上)? 我想notifyDataSetChanged会盲目地重建列表中所有可见项的视图,如果项目发生微不足道的改变,这不是最佳的。

2 个答案:

答案 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对列表项进行了所需的更改。事实证明,工作正常,非常有效。