Android-Listveiw的checkbox,Button焦点问题

本文介绍了解决ListView中CheckBox抢占Item焦点的问题,提供了两种有效的方法:一是设置CheckBox的android:clickable属性为false;二是通过设置ListView或其Item的android:descendantFocusability属性为blocksDescendants来覆盖子控件焦点。此外,还详细介绍了如何在Adapter中正确处理CheckBox的状态,避免复用视图时可能出现的显示异常。

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


CheckBox抢占Item焦点,导致Item点击无效!
方法一:CheckBox设置android:clickable="false" 
方法二:在Item根布局或ListView布局设置android:descendantFocusability="blocksDescendants"

在ListView的Item中的Button,CheckBox等子控件会抢占焦点,使得点击item本身没有响应!
常用android:descendantFocusability=”blocksDescendants”覆盖子类控件焦点
    descendantFocusability属性定义viewGroup和其子控件之间关系:
    beforeDescendants:viewgroup会优先其子类控件而获取到焦点
    afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
    blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点

<LinearLayout
    android:descendantFocusability="blocksDescendants">

    <CheckBox
        android:clickable="false"/> 
</LinearLayout>

<ListView
    android:descendantFocusability="blocksDescendants"/>

适配器在getview()中重复使用[被移除屏幕的item,即不可见的项]
会造成被选中的checkbox重新出现,显示异常,故需要记录checkbox的状态!


public class MyAdapter extends BaseAdapter implements OnItemClickListener { 
    private HashMap<Integer, Boolean> isSelected; // 记录checkbox状态

    public MyAdapter() {        
        // 初始化所有checkbox为未选择  
        isSelected = new HashMap<Integer, Boolean>();  
        for (int i = 0; i < list.size(); i++)
            isSelected.put(i, false);
    }

    @Override  
    public View getView(int position, View convertView, ViewGroup arg2) {              
        ViewHolder holder;
        ...
        holder.cb.setChecked(isSelected.get(position)); // 更新checkbox状态
        return view;
    }  

    @Override  
    public void onItemClick(AdapterView<?> arg0, View view,  
            int position, long arg3) {
        // 切换checkbox状态
        isSelected.put(position, !isSelected.get(position));
        notifyDataSetChanged();
    }  

}  

public class MainActivity extends Activity {
    ...
    MyAdapter adp = new MyAdapter();
    listview.setAdapter(adp);
    listview.setOnItemClickListener(adp);
    ...
}

简书:http://www.jianshu.com/p/b2aa0485f7b8
优快云博客: http://blog.youkuaiyun.com/qq_32115439/article/details/53710915
GitHub博客: http://lioil.win/2016/04/20/ListView-CheckBox.html
Coding博客: http://c.lioil.win/2016/04/20/ListView-CheckBox.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值