如何更新/刷新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