繁体   English   中英

OnClickListener 仅适用于第一个 ViewHolder

[英]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 中,而您从未更改过它。

这是 github 项目的链接,其中包含您的代码和我的答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM