处理按钮单击 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 中使用 cardview 设置 onclick 侦听器,并在单击 recyclerview 时从 firebase 数据库中检索数据?