背景
在 Recyclerview 创建的列表中, 默认的 checkbox 尺寸比较小,并且后面一般会和数字一起组成一个 序号列,从视觉上来看,checkbox 和序号是绑定的,但是触摸有效区域只有很小的方框,比较矛盾。如果使用包裹 checkbox 和 数字的 linearlayout 来处理点击,触摸方便了,但是如果触摸到了 checkbox,那么 layout 的就不会触发,因为只有触摸到非 checkbox 区域才会触摸 layout, 导致处理的逻辑上面会出现一些问题。
解决方法
新建一个 layout,继承 linearlayout, override onInterceptTouchEvent() 这个函数,拦截触摸,使得触摸只能到 layout 这一层,不会再触发到 layout 内部。这样逻辑上面只要处理好 layout 的就可以了。
public class CheckBoxLinearLayout extends LinearLayout {
public CheckBoxLinearLayout(Context context) {
super(context);
}
public CheckBoxLinearLayout(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public CheckBoxLinearLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public CheckBoxLinearLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
//return super.onInterceptTouchEvent(ev);
return true;
}
}
参考:
Recycleview来回滑动时选中的CheckBox消失问题
https://blog.csdn.net/weixin_47592544/article/details/123989788
android中onInterceptTouchEvent()方法详解
https://cloud.tencent.com/developer/article/1459118