ListView + BaseAdapter - 如何通知单个项目的更改?

4

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

当数据发生变化时,我调用BaseAdapter.notifyDataSetChanged。一切都很好。

现在我想知道,如果我更改某个列表项中的一些细节,是否有优化的方法可以更新单个已显示在屏幕上的项目的视图? 我认为如果项目发生了微小的更改,notifyDataSetChanged会盲目地重新构建所有可见项目的视图,这不是最优的。

2个回答

1

不,除非您实现自己的ListView类扩展,否则我认为这是不可能的。

这里有setAdapter()源代码

您会发现,ListView仅使用mAdapter.registerDataSetObserver(mDataSetObserver);将自身注册为观察者。而DataSetObserver无法提供通知特定位置更改的方法。

然而,可能没有必要通知某些项的更新,因为据我所知,ListView仅呈现和更新当前屏幕上看到的项目,因此在这里不需要进行优化。


1

是的,有方法。假设我可以识别列表项,例如通过为其分配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会对列表项进行所需的更改。经过证明,工作良好且非常高效。


看起来是可能的,不确定是否会有任何性能损失?有了这个,我可以推迟更改整个代码到RecyclerView。 - neobie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接