首页 Android 正文
  • 本文约1504字,阅读需8分钟
  • 236
  • 0

RecyclerView的空白区域点击响应

摘要

在项目中使用RecyclerView嵌套RecyclerView,其中内部RecyclerView使用到了GridLayoutManager,在遇到item个数不满足一行时,会在页面右侧透出空白位。我...

在项目中使用RecyclerView嵌套RecyclerView,其中内部RecyclerView使用到了GridLayoutManager,在遇到item个数不满足一行时,会在页面右侧透出空白位。我们可以通过如下的方式去判断空白区域的触摸事件:

recycleView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (v instanceof RecyclerView){
            //TODO 发现只有点击了空白处,v.getId,才能打印出东西

        }
        return false;
    }
});

我们目前是监听了onTouch事件,其中down move up都会触发该事件,我们不能全部都响应,而是应该做出来类似点击的效果,这时候我们就要借助另外一个工具GestureDetector.OnGestureListener判断是否是单击事件

最终方案

public class RecyclerMarginClickHelper {
    public static void setOnMarginClickListener(final RecyclerView recyclerView, final View.OnClickListener onClickListener) {
        if (recyclerView == null || onClickListener == null) {
            return;
        }
        //区分是否是单次点击事件
        final GestureDetector gestureDetector = new GestureDetector(recyclerView.getContext(), new GestureDetector.OnGestureListener() {
            @Override
            public boolean onDown(MotionEvent e) {
                return false;
            }

            @Override
            public void onShowPress(MotionEvent e) {

            }

            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                if (onClickListener != null) {
                    onClickListener.onClick(recyclerView);
                }
                return false;
            }

            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
                return false;
            }

            @Override
            public void onLongPress(MotionEvent e) {

            }

            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
                return false;
            }
        });

        recyclerView.setOnTouchListener(new View.OnTouchListener() {

            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                //发现只有点击了空白处,v是自身recyclerView
                if (view instanceof RecyclerView) {
                    return gestureDetector.onTouchEvent(motionEvent);
                }

                return false;
            }
        });
    }
}
标签:RecyclerView

扫描二维码,在手机上阅读


    评论