ListView与item中控件焦点抢占及错位问题

当ListView的item中包含可点击控件时,会出现焦点抢占问题,导致item无法被点击。解决方法包括在控件上设置`android:focusable="false"`或在父控件上设置`android:descendantFocusability="blocksDescendants"`。然而,这可能导致滚动时的错位问题,即CheckBox等状态错乱。为解决错位,可以在Bean对象中添加状态属性或使用集合保存状态,并在Adapter的getView中处理。

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

焦点抢占

通常在LitView的item里面有可以点击的控件时,这个时候ListView的item将会失去焦点不能点击。
这时有两种解决办法分别如下:
方法一:
就是在该item中要点击的控件上设置android:focusable=”false”这个属性;

方法二:
就是在该item父控件也就是最外层控件上设置android:descendantFocusability=”blocksDescendants”.

错位问题

通过上面两个方法就可以解决item与item中控件焦点的问题。但这时候你会发现新的问题,那就是list一屏展示不下时,如当点击勾选一个CheckBox 时,再滑到另一屏时,你会发现另一屏的也有被勾选上了。所有的CheckBox全错位了,一下感觉全乱套了,这时也有两种方法可以解决。

方法一:
就是在实体Bean对象中添加一个boolean属性来纪录当前状态,及实现get、set方法;完成后再到适配器Adapter的getView中代码实现如下:

     ......
     final CheckBox checkBox = holder.getView(R.id.id_cb);
                checkBox.setChecked(bean.isCheck());
                checkBox.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        bean.setCheck(checkBox.isChecked());
                    }
                });
   ......

方法二:
就是在把当前状态保存到一个集合里面,代码如下:

  ......
   List<Integer> mPos = new ArrayList<>();
    final CheckBox checkBox = holder.getView(R.id.id_cb);
//                checkBox.setChecked(bean.isCheck());
                 checkBox.setChecked(false);
                 if (mPos.contains(position)){
                     checkBox.setChecked(true);
                 }
                checkBox.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
//                        bean.setCheck(checkBox.isChecked());
                        if (checkBox.isClickable()){
                            mPos.add(holder.position);
                        }else {
                            mPos.remove((Integer) holder.position);
                        }
                    }
                });

  ......
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值