Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android RecyclerView中的按钮_Android_Android Recyclerview_Material Design - Fatal编程技术网

Android RecyclerView中的按钮

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

我正在我的应用程序中使用RecyclerView。如中所述,我使用自定义项touch侦听器实现了这一点

我的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) {
            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()
    获取子视图可触摸区域的边界
  • 扩展
    ImageButton的
    hit矩形的边界。 实例化一个
    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()
    获取子视图可触摸区域的边界
  • 扩展
    ImageButton的
    hit矩形的边界。 实例化一个
    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项单击。好的,很抱歉前两种方法都不起作用,我还没有考虑到这一点。也许通读一遍,尤其是最后一节会对你有所帮助。我将编辑答案以获取其中一些有价值的信息。