在recyclerview中刷新行的视图问题

时间:2016-02-16 05:09:46

标签: android android-recyclerview notifydatasetchanged

我想在调用notifyItemChanged时更新recyclerview的视图。问题是我不想刷新整行而只想刷新行的视图。 (以避免行的闪烁效果)

有一个名为notifyItemChanged(int,payload obj)的方法。

我可以用它来实现吗?如果是这样怎么办?

3 个答案:

答案 0 :(得分:13)

最后,我找到了如何仅更新RecyclerView中行的特定视图。

(1)在适配器中覆盖 onBindViewHolder(Recycler.ViewHolder VH,int position,List payloads)

(2)在onBindViewHolder方法中,

if(payloads != null && !payloads.isEmpty() && (payloads.get(0) instanceof  customObject)){
   // update the specific view
}else{
   // I have already overridden  the other onBindViewHolder(ViewHolder, int)
   // The method with 3 arguments is being called before the method with 2 args. 
   // so calling super will call that method with 2 arguments. 
   super.onBindViewHolder(holder,position,payloads);
}

(3)因此要通知数据更改并更新视图,需要调用 notifyItemChanged(int position,Object payload)。需要传递customObject(保存数据的模型)作为有效负载对象。

adapter.notifyItemChanged(i, obj);

注意:需要禁用RecyclerView的ItemAnimator(默认情况下已启用)。否则,有效负载对象将为空。

recyclerView.setItemAnimator(null);

((SimpleItemAnimator)recyclerView.getItemAnimator()).setSupportsChangeAnimations(false);

更新:我最近使用了这种方法而没有禁用ItemAnimator。因此无需禁用ItemAnimator。 - (recyclerview-v7:25.4.0)

for further reference

答案 1 :(得分:3)

您可以使用它来获取更新项目的视图:

View v = recyclerView.getLayoutManager().findViewByPosition(position);
if (v != null){
    //update your view
}

答案 2 :(得分:-1)

假设您有项目列表,并将其提供给RecyclerView适配器。让它成为这样的东西。

List<String> items = new ArrayList<>();
RecyclerAdapter adapter = new RecyclerAdapter(items);
recyclerView.setAdapter(adapter);

现在我可以看到您想要将项目插入RecyclerView并调用notifyItemChanged(int position)方法以仅添加单个项目。

为此,我们说你已经改变了位置0中项目的值。这是列表中的第一项。

现在,方法notifyItemChanged(int position)的正确用法将是

adapter.notifyItemChanged(0);

这意味着,适配器将使用0位置的新值更新recyclerview。