RecyclerView:如何捕获 ImageView 上的 onClick?

Posted

技术标签:

【中文标题】RecyclerView:如何捕获 ImageView 上的 onClick?【英文标题】:RecyclerView: how to catch the onClick on an ImageView? 【发布时间】:2016-01-20 17:30:22 【问题描述】:

我的 RecyclerView 的 CardViews 中有一个 ImageView。 我想捕捉 ImageView 上的 onClick,就像我已经对 ListView 所做的那样。所以,在 public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) 我尝试了:

 myViewHolder.imageView.setClickable(true);
 myViewHolder.imageView.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
               Log.d("TEST", "Clicked");
            

但这完全被忽略了。以下代码正在运行:

 myViewHolder.imageView.setImageResource(R.drawable.star_yellow);

我能做什么?

【问题讨论】:

您能否发布您的 xm 以及可能的 onBindViewHolder 和 ViewHolder 本身?我在 CardView 中有一个带有 ImageViews 的项目,并且 onClick 工作得很好。 ***.com/questions/28379302/… 如果这不起作用也发布您的布局 【参考方案1】:

这是我在项目中所做的。

    在您的项目中某处有一个接口类:

    public interface RecyclerViewClickListener 
    
        void onRowClicked(int position);
        void onViewClicked(View v, int position);
    
    

    在您的 RecyclerView.Adapter 类中,将此接口作为字段添加并通过构造函数将其传递给适配器:

    public class YourRecAdapter extends RecyclerView.Adapter<YourRecAdapter.SimpleViewHolder>
    
        private RecyclerViewClickListener listener;
    
        public YourRecAdapter(RecyclerViewClickListener listener)
            this.listener = listener;
        
    
        public static class SimpleViewHolder extends RecyclerView.ViewHolder 
    
            public SimpleViewHolder(View itemView, final RecyclerViewClickListener listener) 
                super(itemView);
    
                // find view ids here
    
                itemView.setOnClickListener(new View.OnClickListener() 
                    @Override
                    public void onClick(View v) 
                        if(listener != null)
                            listener.onRowClicked(getAdapterPosition());
                    
                );
    
                someViewholderView.setOnClickListener(new View.OnClickListener() 
                    @Override
                    public void onClick(View v) 
                        if(listener != null)
                            listener.onViewClicked(v, getAdapterPosition());
                    
                );
            
        
    
    

    在你的Activity/Fragment中实现接口:

    public class YourFragment extends Fragment implements RecyclerViewClickListener 
    
       @Override
       public void onViewClicked(View v, int position) 
           if(v.getId == R.id.yourDesiredView)
               // Do your stuff here
           
       
    
       @Override
       public void onRowClicked(int position) 
           // Clicked entire row
       
    
    

【讨论】:

谢谢回复,但是onBindViewHolder方法中不能管理点击吗? 是的,只需将我所有的 .setOnClickListener(...) 内容移动到 onBindViewHolder() 方法即可。然后,您不必将侦听器传递给 ViewHolder 的构造函数。但是,我认为在 ViewHolder 中使用 onClick 方法效率更高,否则当您滚动列表时它们会一直重新创建。 在 MyFragment 中我要创建一个 RecyclerViewClickListener 类型的新对象并将其作为参数传递给 Adapter 构造函数? 是的,只需传递 'this' 作为参数,让您的 Fragment 实现接口。根据需要向适配器添加任何其他参数(数据、上下文等)。 嗨@Tomislav。我正在尝试这样做,你在这里解释,但我可以从我的片段中调用接口。我已经打开了一个关于这个的帖子(***.com/questions/38954507/…)你能看看有什么问题吗???【参考方案2】:

在您的 Viewholder 类中,您可以设置 OnClickListener,但您需要另一个接口才能将 OnClick 寄存器传递回您的适配器(或您的预期目标所在的任何位置)。

【讨论】:

对不起。这取决于您尝试使用 OnClick 做什么。如果您正在执行可以在 ViewHolder 本身内部本地完成的操作(例如调整图像大小),则您不需要接口或任何其他将 OnClick 传递回适配器的方法。但是,如果您尝试保存移动到新活动或切换到 ViewHolder 没有引用的图像,您将需要 ViewHolder 引用的自定义侦听器(接口),然后拥有活动或适配器可以监听。 我需要在onBindViewHolder中进行操作

以上是关于RecyclerView:如何捕获 ImageView 上的 onClick?的主要内容,如果未能解决你的问题,请参考以下文章

recyclerview行IGNORE重复

带有 CollapsingToolbarLayout 的 Android RecyclerView 平滑滚动问题

当我将 ImageView 添加到 CardView 或 Fragment 时,为啥我的应用程序会崩溃?

如何使用 RecyclerView.State 保存 RecyclerView 的滚动位置?

如何从 recyclerview 片段传递到另一个 recyclerview 片段

如何从其他recyclerview接收recyclerview中的数据?