我正在使用以下代码来处理行点击 . (source)
static 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) {
}
}
但是,如果我想在每一行上说一个删除按钮,这是有效的 . 我不确定如何实现这一点 .
我附加了OnClick监听器来删除工作的按钮(删除行),但它也会触发整行上的onclick .
如果单击一个按钮,任何人都可以帮助我避免完全行单击 .
谢谢 .
6 回答
这就是我在recyclelerView中处理多个onClick事件的方法:
Edit : 已更新以包含回调(如其他注释中所述) . 我在
ViewHolder
中使用了WeakReference
来消除潜在的内存泄漏 .定义界面:
那么适配器:
然后在你的活动/片段中 - 你可以实现的任何东西:
Clicklistener
- 或者如果你愿意的话,也可以是匿名类:要获取单击的项目,您将匹配视图ID,即v.getId()== whateverItem.getId()
希望这种方法有帮助!
我发现通常:
我需要使用多个监听器,因为我有几个按钮 .
我希望我的逻辑在活动中,而不是适配器或视图 .
所以@mark-keen的答案效果很好但是有一个界面提供了更多的灵活性:
在适配器中定义onClickListener的位置:
并且可能通过构造函数设置:
然后,您可以处理Activity中的事件或使用RecyclerView的任何位置:
我想要一个没有创建任何 extra 对象(即监听器)的解决方案,这些对象必须在以后进行垃圾收集,并且不需要在适配器类中嵌套视图持有者 .
在
ViewHolder
班注意事项:
ClickHandler
接口已定义,但未在此处初始化,因此onClick
方法中没有假设它已被初始化 .ClickHandler
界面如下所示:在适配器中,在构造函数中设置'ClickHandler'的实例,并覆盖
onBindViewHolder
,以在视图持有者上初始化`clickHandler':注意:我知道viewHolder.clickHandler可能会使用完全相同的值多次设置,但这比检查null和分支更便宜,而且没有内存开销,只需要额外的指令 .
最后,在创建适配器时,您必须将
ClickHandler
实例传递给构造函数,如下所示:请注意,
adapter
在此处是成员变量,而不是局部变量如果您已经拥有一个回收器触摸侦听器并想要处理其中的所有触摸事件而不是在视图持有者中单独处理按钮触摸事件,那么只是想添加另一个解决方案 . 这个改编版本的关键是在点击时返回onItemClick()回调中的按钮视图,而不是项容器 . 然后,您可以测试作为按钮的视图,并执行不同的操作 . 请注意,长按此按钮会被解释为长按整个行 .
然后从activity / fragment中使用它:
处理click事件时,需要在
onInterceptTouchEvent()
内返回true .您可以先检查是否有任何类似的条目,如果您获得大小为0的集合,则启动要保存的新查询 .
要么
更专业,更快捷的方式 . 创建 Cloud 触发器(保存前)
看看这个答案https://stackoverflow.com/a/35194514/1388852