RecyclerView的空白区域点击响应
在项目中使用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;
}
});
}
}