我正在学习编写Android Apps,现在遇到了一个愚蠢的问题。我有一个带有许多Viewholder的recyclerview,现在,当单击它时,我想将其删除,因此显然我要删除该项目,即Viewholder正在显示(因此,所代表的对象不是持有者本身),并将更改通知给recyclerview。因此,现在我想我应该在ViewHolder创建后立即在ItemView上设置onclickListener,但是不知何故,它总是会删除第一个元素,而当我想删除另一个元素时,我需要暂停应用程序,这样就生成了Viewholder再次。因此,当我单击除第一个持有人以外的其他持有人(但始终是列表中最重要的项目)时,它也会删除。
所以这是我的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数据)方法是我的适配器中的方法:
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文件,其中包含约束布局,布局中包含三个textview。布局没有ID,因此我只使用了:
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_view,viewGroup,false);
但是我怀疑那是问题。
[请不要使用此答案,因为它会导致滚动(绑定)过程中点击侦听器的重新播放。
您可以在onBindViewHolder
中放置事件侦听器。
@Override
public void onBindViewHolder(@NonNull RecycleViewHolder recycleViewHolder, int i) {
RowData item = recycleViewHolder.item;
recycleViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
RemoveItem(item);
}
});
}
也从itemView.setOnClickListener...
中删除RecycleViewHolder
。
我认为是,没有检查。
请使用:
RemoveItem(RecycleViewHolder.this.item);
Here is a link to a github project with your code and my answer.