【问题标题】:RecyclerView: how to catch the onClick on an ImageView?RecyclerView:如何捕获 ImageView 上的 onClick?
【发布时间】: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 工作得很好。
  • stackoverflow.com/questions/28379302/… 如果这不起作用也发布您的布局

标签: android imageview android-recyclerview android-cardview


【解决方案1】:

这是我在项目中所做的。

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

    public interface RecyclerViewClickListener {
    
        void onRowClicked(int position);
        void onViewClicked(View v, int position);
    }
    
  2. 在您的 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());
                    }
                });
            }
        }
    }
    
  3. 在你的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。我正在尝试这样做,你在这里解释,但我可以从我的片段中调用接口。我已经打开了一个关于这个的帖子(stackoverflow.com/questions/38954507/…)你能看看有什么问题吗???
【解决方案2】:

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

【讨论】:

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