Android中长按事件时短按事件也触发的问题

在处理Android列表项的长按和点击事件时,发现长按时短按事件也会触发。原因是长按事件return false导致事件继续向下分发。理解Android事件分发机制后,解决方法是在长按事件中返回true,阻止事件传播,防止短按事件被错误触发。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载请标明出处

http://blog.youkuaiyun.com/mohan6/article/details/78565070

本文作者:【默寒的博客】


最近接手了一个二手的项目,改别人写了半拉的页面的时候,写了个列表的条目长按事件和条目点击事件如下:

 lvCoupon.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
                for (CouponBean.CouponsBean bean : couponBean.getCoupons()) {
                    bean.isSelect = false;
                }
                couponBean.getCoupons().get(position).isSelect = true;
                adapter.notifyDataSetChanged();
            }
        });

 // 长按取消选择
        lvCoupon.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> adapterView, View view, int position, long l) {
                CouponBean.CouponsBean couponsBean = couponBean.getCoupons().get(position);
                couponsBean.isSelect = false;
                adapter.notifyDataSetChanged();
                return true;
            }
        });

需求:点击条目,checkBox选中;长按条目checkBox取消选中。

BUG现象:长按条目时,按的时候checkBox取消选中,手抬起时,checkBox被选中。

导致BUG原因:长按事件return false导致的。

 // 长按取消选择
        lvCoupon.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> adapterView, View view, int position, long l) {
                CouponBean.CouponsBean couponsBean = couponBean.getCoupons().get(position);
                couponsBean.isSelect = false;
                adapter.notifyDataSetChanged();
                return false;
            }
        });

原理:

  这个需要从事件分发机制说起,在按钮响应事件的时候,如果同时绑定了长按和点击事件,长按事件触发时默认不做处理的话会优先响应长按事件,如果在长按事件里面你没有消费掉该事件,根据安卓的事件分发机制,该事件会继续向下传递,直到有控件把它消费掉为止。明白了这个道理,长按事件和短按事件同时响应的问题就不难解决了,在同时绑定两个事件的情况下,如果先点击的是短按事件没问题,自然触发不到长按事件,但是如果先触发的是长按事件如果当前return false的话代表当前事件需要继续向下传递所以短按事件就被响应了,这种情况在onLongClick中返回true即可,代表当前有能力消费掉该事件,阻止事件向下传递,短按事件就不会被触发了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值