ramlife

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

背景

在 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

posted on 2022-10-04 16:12  ramlife  阅读(163)  评论(0)    收藏  举报