Android RecyclerView中的按钮
我正在我的应用程序中使用RecyclerView。如中所述,我使用自定义项touch侦听器实现了这一点 我的TouchListener如下所示:Android RecyclerView中的按钮,android,android-recyclerview,material-design,Android,Android Recyclerview,Material Design,我正在我的应用程序中使用RecyclerView。如中所述,我使用自定义项touch侦听器实现了这一点 我的TouchListener如下所示: public class RecyclerTouchListener implements RecyclerView.OnItemTouchListener { private GestureDetector gestureDetector; private ClickListener clickListener; public Recycle
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) {
Log.v(getClass().getName(), "onSingleTapUp " + e);
return true;
//return super.onSingleTapUp(e);
}
@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));
}
Log.v(getClass().getName(), "onLongPress" + e);
}
});
Log.v(getClass().getName(), "construtcor invoked");
}
@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) {
Log.v(getClass().getName(), "onTouchEvent " + e);
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
}
现在,当用户Ravi询问时,我想在recycler视图的每个项目中添加一个按钮。但是,如果我单击此按钮,也会触发click listener项。如何实现按钮的单击侦听器而不会对项目本身产生任何副作用?编辑:我认为这会有所帮助。稍后,我将尝试添加一些关于RecyclerView
的代码片段
下面的代码段执行以下操作:
- 获取
,并在父视图
上发布一个UI线程
。这样可以确保父对象在调用Runnable
方法之前布局其子对象李>getHitRect()
方法在父坐标中获取子对象的命中矩形(可触摸区域)李>getHitRect()
- 查找
子视图,并调用ImageButton
获取子视图可触摸区域的边界getHitRect()
- 扩展
hit矩形的边界。 实例化一个ImageButton的
,将扩展的点击矩形和TouchDelegate
子视图作为参数传递ImageButton
- 在父视图上设置
,以便将触摸代理边界内的触摸路由到子视图TouchDelegate
我认为在
onInterceptTouchEvent()
中,您可以执行以下操作
if(按钮的子实例){…}
要仅获取按钮
请单击。但这看起来很糟糕。您还可以检查ID是否匹配:
if(child.getId() == R.id.myRvButton){...}
否则,您可以在onBindViewHolder
中的OnClickListener
适配器中添加OnClickListener
,类似于holder.button.setOnClickListener(…)
。但是如果您想要另一个单击事件
,如果用户单击该项目,您可以尝试上述方法。编辑:我认为可能会有所帮助。稍后,我将尝试添加一些关于RecyclerView
的代码片段
下面的代码段执行以下操作:
- 获取
,并在父视图
上发布一个UI线程
。这样可以确保父对象在调用Runnable
方法之前布局其子对象李>getHitRect()
方法在父坐标中获取子对象的命中矩形(可触摸区域)李>getHitRect()
- 查找
子视图,并调用ImageButton
获取子视图可触摸区域的边界getHitRect()
- 扩展
hit矩形的边界。 实例化一个ImageButton的
,将扩展的点击矩形和TouchDelegate
子视图作为参数传递ImageButton
- 在父视图上设置
,以便将触摸代理边界内的触摸路由到子视图TouchDelegate
我认为在
onInterceptTouchEvent()
中,您可以执行以下操作
if(按钮的子实例){…}
要仅获取按钮
请单击。但这看起来很糟糕。您还可以检查ID是否匹配:
if(child.getId() == R.id.myRvButton){...}
否则,您可以在
onBindViewHolder
中的OnClickListener
适配器中添加OnClickListener
,类似于holder.button.setOnClickListener(…)
。但是如果您想要另一个单击事件
如果用户单击该项目,您可以尝试上述方法。我认为在onInterceptTouchEvent()
中,您可以执行类似if(child instanceof Button){…}
的操作,以仅获取按钮
单击。否则,您可以在onBindViewHolder
中的OnClickListener
适配器中添加OnClickListener
,类似于holder.button.setOnClickListener(..)
我认为在oninterceptouchevent()
中,您可以执行类似于if(child instanceof button){…}/code>的操作,以仅获取按钮。否则,您可以在onBindViewHolder
中的OnClickListener
适配器中添加OnClickListener
,类似于holder.button.setOnClickListener(…)
您已经描述了三种不同的方法。好主意。但前两种方法不起作用。代码不会运行到if语句的主体中。在第三种方法中,都会触发按钮单击和recyclerview项单击。好的,很抱歉前两种方法都不起作用,我还没有考虑到这一点。也许通读一遍,尤其是最后一节会对你有所帮助。我将编辑答案以获取其中一些有价值的信息。您已经描述了三种不同的方法。好主意。但前两种方法不起作用。代码不会运行到if语句的主体中。在第三种方法中,都会触发按钮单击和recyclerview项单击。好的,很抱歉前两种方法都不起作用,我还没有考虑到这一点。也许通读一遍,尤其是最后一节会对你有所帮助。我将编辑答案以获取其中一些有价值的信息。