转载请标明出处
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即可,代表当前有能力消费掉该事件,阻止事件向下传递,短按事件就不会被触发了。
Android中长按事件时短按事件也触发的问题
最新推荐文章于 2022-09-15 14:00:58 发布