如何在RecyclerView中检测嵌套视图上的点击?

时间:2017-01-02 22:19:55

标签: android android-recyclerview

我正在使用RecyclerView以自定义布局显示这些CardView。我想要做的是检测用户点击播放按钮的时间,以及他们点击CardView的时间。目前我正在使用RecyclerView.OnItemTouchListener,但它似乎无法产生我需要的所有事件(播放按钮点击。)

Screenshot

public class RecyclerTouchListener implements RecyclerView.OnItemTouchListener {

private GestureDetector gestureDetector;
private ClickListener clickListener;

public interface ClickListener {
    void onClick(View view, int position);

    void onLongClick(View view, int position);
}

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.getChildAdapterPosition(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.getChildAdapterPosition(child));
    }
    return false;
}

@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
}

@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

}

}

这段代码只告诉我,当点击CardView时,我也希望点击播放按钮。我应该在我的适配器类中设置onClick侦听器,即使这看起来像是一种不好的做法吗?

感谢您的时间。

2 个答案:

答案 0 :(得分:0)

我不确定这一点(因为我正在做相反的事情,点击儿童点击父母),但是 android:clickable="false" android:focusable="false" 可以帮到你:将你的根视图设置为不可点击/可聚焦,然后在你的按钮上添加一个点击监听器,没有任何拦截。

希望这有帮助。

答案 1 :(得分:0)

我希望能找到适合RecyclerView.OnItemTouchListener的东西,因为它似乎是实现这一目标的正确方法。最后,我认为最好的方法是在RecyclerView的适配器类中设置onClick侦听器(这就是我要做的。)

感谢您提供帮助。

这是一位评论员建议的帖子,作为我计划做的事情的替代。

Handle Button click inside a row in RecyclerView