如何更新/刷新RecyclerView中的特定项目

我正在尝试刷新RecyclerView特定项目。

故事:每当用户点击项目,它显示AlertDialog 。 用户可以通过点击确定button来input一些文字。 我想在这个项目中显示这个文本,并显示不可见的ImageView – 在XML和适配器ViewHolder

我在AlertDialog Positive Button中使用这个函数来更新这个项目:

 private void updateListItem(int position) { View view = layoutManager.findViewByPosition(position); ImageView medicineSelected = (ImageView) view.findViewById(R.id.medicine_selected); medicineSelected.setVisibility(View.VISIBLE); TextView orderQuantity = (TextView) view.findViewById(R.id.order_quantity); orderQuantity.setVisibility(View.VISIBLE); orderQuantity.setText(quantity + " packet added!"); medicinesArrayAdapter.notifyItemChanged(position); } 

但是这段代码不仅改变了传递位置处的itemView,还改变了其他一些itemView(s)!

点击它应该如何正确更改特定的itemView?

您可以使用RecyclerView.Adapter类中的notifyItemChanged(int position)方法。 从文档:

通知任何注册的观察者,位置上的项目已经改变。 相当于调用notifyItemChanged(position,null);.

这是项目更改事件,而不是结构更改事件。 它表明任何对位置数据的反映都是过时的,应该更新。 位置上的项目保留相同的身份。

因为你已经有了这个职位,所以应该为你工作。

我想我有一个关于如何处理这个问题的想法。 更新与在确切的位置删除和replace相同。 所以我首先使用下面的代码从该位置删除项目:

 public void removeItem(int position){ mData.remove(position); notifyItemRemoved(position); notifyItemRangeChanged(position, mData.size()); } 

然后我会在该特定位置添加该项目,如下所示:

 public void addItem(int position, Landscape landscape){ mData.add(position, landscape); notifyItemInserted(position); notifyItemRangeChanged(position, mData.size()); } 

我正在尝试实现这一点。 当我通过时,我会给你一个反馈!

我需要通过捕获需要修改的项目的位置,然后在适配器调用中解决此问题

 public void refreshBlockOverlay(int position) { notifyItemChanged(position); } 

,这将在这个特定的位置调用onBindViewHolder(ViewHolder holder,int position)这个特定的项目。

这也是我的最后一个问题。 在这里我的解决scheme使用我的RecyclerView的数据模型和适配器

  **Firstly, register your new data to your model** DataModel detail = new DataModel(id, name, sat, image); **after that, use set to replace old value with the new one** mData.set(index, detail); **finally, refresh your adapter** if(adapter!=null) adapter.notifyItemChanged(index); 

在您的RecyclerView适配器中,您应该有一个ArrayList,还有一个方法addItemsToList(items)将列表项添加到ArrayList。 然后,您可以通过dynamic调用adapter.addItemsToList(items)来添加列表项。 所有的列表项添加到ArrayList后,你可以调用adapter.notifyDataSetChanged()来显示你的列表。

您可以在RecyclerView的适配器中使用notifyDataSetChanged