[英]OnClickListener only works on first ViewHolder
我现在正在学习编写 Android 应用程序并且遇到了一个非常愚蠢的问题。 我有一个里面有一堆视图的recyclerview,现在,当它被点击一个时,我想删除它,所以很明显我会删除该项目,视图持有者正在显示(所以object代表而不是持有人本身)并通知recyclerview更改。 所以现在我想我一旦创建 ViewHolder 就设法在 ItemView 上设置了一个 onclickListener ,但不知何故它总是只删除第一个元素,当我想删除另一个元素时,我需要暂停应用程序,因此生成了 viewholders再次。 因此,当我单击第一个以外的另一个持有人时,它也会删除,但始终是列表中最上面的项目。
所以这是我的 Viewholder 代码:
class RecycleViewHolder extends RecyclerView.ViewHolder {
//Some textViews
public RowData item;
public RecycleViewHolder(@NonNull View itemView, final RowData item) {
super(itemView);
//Assign textViews in the itemView to variables
this.item = item;
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
RemoveItem(item);
}
});
}
}
而上面的 RemoveItem(Rowdata data) 方法是我的 Adapter 中的一个方法:
public class RecycleAdapter extends RecyclerView.Adapter<RecycleAdapter.RecycleViewHolder> {
private List<RowData> items;
public RecycleAdapter(List<RowData> items) {
this.items = items;
}
@NonNull
@Override
public RecycleViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_view,viewGroup,false);
return new RecycleViewHolder(view, items.get(i));
}
@Override
public void onBindViewHolder(@NonNull RecycleViewHolder recycleViewHolder, int i) {
RowData actualData = items.get(i);
//Set texts in textViews
recycleViewHolder.item = actualData;
}
public void RemoveItem(RowData item) {
items.remove(item);
this.notifyDataSetChanged();
}
我不知道,如果您需要 xml,但它只是一个标准的 xml 文件,其中包含约束布局和布局中的三个文本视图。 布局没有id,所以我只使用了:
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_view,viewGroup,false);
但我怀疑这是问题所在。
请用:
RemoveItem(RecycleViewHolder.this.item);
并不是:
RemoveItem(item);
原因是您将变量项复制到clickListener object 中,而您从未更改过它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.