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

Elg*_*ndy 96 android android-adapter recycler-adapter android-recyclerview

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

故事:每当用户点击项目时,它都会显示AlertDialog.用户可以通过单击确定按钮键入一些文本.我想在这个项目中显示这个文本并显示不可见ImageView- 在XML和适配器中声明ViewHolder-

我在AlertDialogPositive 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);
}
Run Code Online (Sandbox Code Playgroud)

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

如何通过单击更改特定的itemView?

Eds*_*tti 88

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

通知任何注册观察员该位置的项目已更改.相当于调用notifyItemChanged(position,null);.

这是一个项目更改事件,而不是结构更改事件.它表示位置数据的任何反映都已过时,应予以更新.位置处的项目保留相同的标识.

由于你已经拥有这个职位,它应该适合你.

  • 我已经使用过了,但如果我想更新位置0,它会更新位置0,9,19,...... (6认同)

Sur*_*gch 31

更新单个项目

  1. 更新数据项
  2. 通知适配器的更改 notifyItemChanged(updateIndex)

更改"羊"项目,使其显示"我喜欢羊".

更新单个项目

String newValue = "I like sheep.";
int updateIndex = 3;
data.set(updateIndex, newValue);
adapter.notifyItemChanged(updateIndex);
Run Code Online (Sandbox Code Playgroud)

我举出更多的例子全面的回答是这里.

  • @SouravKannanthaB,抱歉,我不确定。我改用了 Flutter,所以我忘记了很多关于 Android 的事情。(顺便说一句,ListView 在 Flutter 中处理起来要容易得多。我很高兴不再使用 RecyclerView。) (2认同)

EGB*_*yuk 8

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

public void removeItem(int position){
    mData.remove(position);
    notifyItemRemoved(position);
    notifyItemRangeChanged(position, mData.size());
}
Run Code Online (Sandbox Code Playgroud)

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

public void addItem(int position, Landscape landscape){
    mData.add(position, landscape);
    notifyItemInserted(position);
    notifyItemRangeChanged(position, mData.size());
}
Run Code Online (Sandbox Code Playgroud)

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

  • 你正在做一个额外的步骤.只需替换位置上的元素并调用item notifyItemChanged(position); (2认同)

小智 7

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

public void refreshBlockOverlay(int position) {
    notifyItemChanged(position);
}
Run Code Online (Sandbox Code Playgroud)

,这将在此特定位置为此特定项调用onBindViewHolder(ViewHolder holder,int position).


小智 6

将更改的文本添加到模型数据列表

mdata.get(position).setSuborderStatusId("5");
mdata.get(position).setSuborderStatus("cancelled");
notifyItemChanged(position);
Run Code Online (Sandbox Code Playgroud)