OnClickListener仅适用于第一个ViewHolder

问题描述 投票:1回答:2

我正在学习编写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);

但是我怀疑那是问题。

android android-layout android-recyclerview onclicklistener android-viewholder
2个回答
0
投票

[请不要使用此答案,因为它会导致滚动(绑定)过程中点击侦听器的重新播放。

您可以在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

我认为是,没有检查。


0
投票

请使用:

 RemoveItem(RecycleViewHolder.this.item);

Here is a link to a github project with your code and my answer.

© www.soinside.com 2019 - 2024. All rights reserved.