处理按钮单击 RecyclerView 中的侦听器

Posted

技术标签:

【中文标题】处理按钮单击 RecyclerView 中的侦听器【英文标题】:Handle Button click Listener in RecyclerView 【发布时间】:2017-06-18 12:40:47 【问题描述】:

我正在尝试将 onClickListener 用于 RecyclerView 行内的按钮,并且我的 RecyclerView 行也有单击侦听器,现在的问题是,如果我单击 RecyclerView 行上的按钮,它也会触发 RecyclerView 的单击侦听器行,顺便说一下,我使用的是片段。

这是 RecyclerView touchListener 的自定义类

public class RecyclerTouchListener implements RecyclerView.OnItemTouchListener 

private GestureDetector gestureDetector;
private ClickListener clickListener;

public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final ClickListener clickListener) 
    this.clickListener = clickListener;
    gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() 
        @Override
        public boolean onSingleTapUp(MotionEvent e) 

            return true;
        

        @Override
        public void onLongPress(MotionEvent e) 

            View child = recyclerView.findChildViewUnder(e.getX(), e.getY());

            if (child != null && clickListener != null) 
                clickListener.onLongClick(child, recyclerView.getChildPosition(child));

            
        
    );


@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) 

    View child = rv.findChildViewUnder(e.getX(), e.getY());
    if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) 
        clickListener.onClick(child, rv.getChildPosition(child));

    
    return false;


@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) 


@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) 



public static  interface ClickListener 

    void onClick(View view, int position);
    void onLongClick(View view, int position);

这是按钮的 ViewHolder

 public static class RecycleViewHolder extends RecyclerView.ViewHolder

    ImageButton BTN_B, BTN_A, BTN_C;

    public RecycleViewHolder(View view)

        super(view);

        ItemImage      = (ImageView) view.findViewById(R.id.item_item_image);

        BTN_A = (ImageButton) view.findViewById(R.id.button_a);
        BTN_B = (ImageButton) view.findViewById(R.id.button_b);
        BTN_C = (ImageButton) view.findViewById(R.id.button_c);

       BTN_B.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                Toast.makeText(CTX,"B Button Clicked"+getAdapterPosition(),Toast.LENGTH_SHORT).show();
            
        );

        BTN_A.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                Toast.makeText(CTX,"A Button Clicked"+getAdapterPosition(),Toast.LENGTH_SHORT).show();
            
        );

        BTN_C.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View v) 
                Toast.makeText(CTX,"C Button Clicked"+getAdapterPosition(),Toast.LENGTH_SHORT).show();
            
        );
    

【问题讨论】:

【参考方案1】:

不是为整个回收器视图实现点击事件,而是获取回收器视图的子布局的父元素并为其添加点击事件,就像您为 BTN_A、BTN_B、BTN_C 添加的一样,

例如,如果回收器视图的子布局(子布局中最顶层的视图)的父元素是相对布局,则为 relativelayout 添加 onclick 事件

【讨论】:

以上是关于处理按钮单击 RecyclerView 中的侦听器的主要内容,如果未能解决你的问题,请参考以下文章

如何在MVVM架构中观察RecyclerView适配器中的LiveData?

处理Android Recyclerview中的多个按钮单击并将响应存储在Array或ArrayList中

ViewHolder 中的 onClick 无权访问适配器中的单击项目

RecyclerView中的按钮无法单击或选择[重复]

处理多个按钮单击侦听器

如何在我的 recyclerview 中使用 cardview 设置 onclick 侦听器,并在单击 recyclerview 时从 firebase 数据库中检索数据?