如何解决单击水平 RecyclerView 中的项目的问题?

Posted

技术标签:

【中文标题】如何解决单击水平 RecyclerView 中的项目的问题?【英文标题】:How can I solve a problem with click on item in horizontal RecyclerView? 【发布时间】:2021-02-03 04:58:23 【问题描述】:

我有一个水平回收站视图。有一些按钮。我将在下面提供我的代码。所以问题是当我点击一个按钮时,什么都没有发生。它只是认为我没有点击它。我有另一个回收站视图,但垂直且代码非常相似,但第二个有效。我一直在寻找一个错误。我真的希望你能帮助我。谢谢。

在我的主要:

  adapter1 = new RecyclerViewAdapterContinentsList(this, idList,continentList);
            recyclerViewForContinents.setAdapter(adapter1);
            adapter1.setClickListener(new RecyclerViewAdapterContinentsList.ItemClickListener() 
                @Override
                public void onItemClick(View view, int position) 
                    Toast.makeText(getApplicationContext(),"name",Toast.LENGTH_SHORT).show();
                    
                
            );

recyclerView 类:

public class RecyclerViewAdapterContinentsList extends RecyclerView.Adapter<RecyclerViewAdapterContinentsList.ViewHolder>
    private List<String> mId;
    private List<String> mName;
    private LayoutInflater mInflater;
    private ItemClickListener mClickListener;
    Context context;

    RecyclerViewAdapterContinentsList(Context context, List<String> id, List<String> name) 
        this.mInflater = LayoutInflater.from(context);
        this.mId = id;
        this.mName = name;
        this.context = context;
    

    // inflates the row layout from xml when needed
    @Override
    public ViewHolder onCreateViewHolder (ViewGroup parent, int viewType) 
        View view = mInflater.inflate(R.layout.activity_recycler_view_adapter_countinent_list, parent, false);
        return new ViewHolder(view);
    

    // binds the data to the TextView in each row
    @Override
    public void onBindViewHolder(ViewHolder holder,final int position) 
        String id = mId.get(position);
        String name = mName.get(position);
        holder.continentBtn.setText(name);
    

    // total number of rows
    @Override
    public int getItemCount() 
        return mName.size();
    


    // stores and recycles views as they are scrolled off screen
    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener 
        Button continentBtn;

        ViewHolder(View itemView) 
            super(itemView);
            continentBtn = itemView.findViewById(R.id.continentBtn);
            itemView.setOnClickListener(this);
        

        @Override
        public void onClick(View view) 
            if (mClickListener != null) 
                Toast.makeText(context,"name",Toast.LENGTH_SHORT).show();
                mClickListener.onItemClick(view, getAdapterPosition());
        
    

    // convenience method for getting data at click position
    String getItem(int id) 
        return mId.get(id);
    

    void setClickListener(RecyclerViewAdapterContinentsList.ItemClickListener itemClickListener) 
        Toast.makeText(context,"name",Toast.LENGTH_SHORT).show();
        this.mClickListener = itemClickListener;
    

    public interface ItemClickListener 
        void onItemClick(View view, int position);
    

【问题讨论】:

【参考方案1】:

更改您的 ViewHolder 代码以将 OnClickListener 附加到按钮而不是 itemView。

ViewHolder(View itemView) 

    super(itemView);
    continentBtn = itemView.findViewById(R.id.continentBtn);
    continentBtn.setOnClickListener(this);  // <-- button not itemView

在您的 ViewHolder 中,itemView 是您布局的根 viewGroup R.layout.activity_recycler_view_adapter_countinent_list,RecyclerView 可以使用 setOnItemClickListener 监听整行的点击事件。

【讨论】:

天啊,就是这么简单。非常感谢。你能说一下这个siruation中的itemView是什么意思吗?【参考方案2】:

很简单,

首先您在按钮视图中提供 id,而不是在 onBindViewHolder 中的适配器中提供 id

在视图中设置监听器并在监听器中执行任何事件。

 @Override
    public void onBindViewHolder(@NonNull final recycler_item_ads.ViewHolder holder, final int position) 
        holder.installnow.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 

                   //here print toast
                 
              
            
        );

holfer.install 现在是我在布局文件中的按钮

【讨论】:

以上是关于如何解决单击水平 RecyclerView 中的项目的问题?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过单击 recyclerview 中的项目来打开新活动 [重复]

如何正确突出显示 RecyclerView 上的选定项目?

创建具有水平和垂直滚动的 RecyclerView

单击 Recyclerview 中的项目后,OnItem 单击无法正常工作

如何在片段中的 recyclerView 上打开不同的活动?

RecyclerView - 获取特定位置的视图