android - OnClickListener 仅适用于第一个 ViewHolder
问题描述
我现在正在学习编写 Android 应用程序并且遇到了一个非常愚蠢的问题。我有一个里面有一堆视图的recyclerview,现在,当它被点击一个时,我想删除它,所以很明显我会删除那个项目,视图持有者正在显示(所以代表的对象而不是持有人本身)并通知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);
原因是您将变量 item 复制到 clickListener 对象中,而您从不更改它。
推荐阅读
- oracle - 存储过程将选择哪个 NLS_DATE_FORMAT
- web-applications - Java Spring Boot 相关会话超时
- react-native - json对象的react-native浏览器控制台日志记录
- asp.net - 错误 400 错误请求 Angular 5 使用令牌登录
- python - 如何在 Azure 管道中设置多个图像
- android - 在另一个片段中的视图寻呼机中刷新片段
- ssis - SSIS 中的 SFTP 文件传输
- string - 如何在循环中显示两个字符串数组中的不同元素?
- angular - Angular 检测何时发送请求并在 Angular 6 中完成
- python - Python:list() 函数弄乱了 map()