【问题标题】:Handle Button click Listener in RecyclerView处理按钮单击 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();
            }
        });
    }
}

【问题讨论】:

    标签: android button android-recyclerview fragment


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-12-02
      • 1970-01-01
      • 2015-07-31
      • 1970-01-01
      • 1970-01-01
      • 2018-08-05
      • 1970-01-01
      • 2019-12-26
      • 1970-01-01
      相关资源
      最近更新 更多