给ListView的Item添加CheckBox,长按调出CheckBox,然后通过点击进行选中和取消

  • 首先制作一个CheckBox式样
  • 在drawable文件夹中添加文件custom_checkbox_style.xml,内容如下
    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/fm_checkbox_pressed" android:state_checked="true"/>
    <item android:drawable="@drawable/fm_checkbox_normal" android:state_checked="false"/>
    <item android:drawable="@drawable/fm_checkbox_normal"/>
    </selector>

  • 在values文件夹的styles.xml文件中添加如下内容
    <style name="CustomCheckBoxTheme" parent="@android:style/Widget.CompoundButton.CheckBox">
    <item name="android:button">@drawable/custom_checkbox_style</item>
    </style>

  • 在ListView的Item的布局文件中添加CheckBox的相关代码,内容如下
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    ......
    android:descendantFocusability="blocksDescendants">
    
    <CheckBox
    android:id="@+id/edit_select"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:layout_marginStart="6dp"
    android:layout_marginEnd="6dp"
    style="@style/CustomCheckboxTheme"
    android:visibility="gone"/>
    .
    .
    .
    .
    .
    .
    </LinearLayout>

  • 特别要说一下android:descendantFocusability="blocksDescendants"这个属性,它的作用是使该控件包含的子控件全部失去焦点,即失去点击效果和作用,这个属性很重要,如果不添加,在这个布局中获取点击焦点的就是CheckBox,而ListView的onItemClick事件就不能触发了
  • 然后要修改的就是代码逻辑问题了,修改位置是vender/mediatek/properties/packags/apps/FileManager/src/com/mediatek/filemanager/FileInfoAdapter.java
  • 代码中定义了一个FileViewHolder用来管理ListView的Item布局(即上面的写道的布局文件)中的所用控件,这里我们要添加一个CheckBox对象,并在构造方法中进行初始化
    static class FileViewHolder{
    protect TextView mName;
    protect TextView mSize;
    protect ImageView mIcon;
    protect CheckBox mCheckBox;
    
    public FileViewHolder(TextView name,TextView size,ImageView icon,CheckBox checkbox){
    this.mName=name;
    this.mSize=size;
    this.mIcon=icon;
    this.mCheckBox=checkbox;
    }
    }

  • 最后对getView方法进行修改,这里要清楚getView的实现机制,是如何加载布局的(参考:http://blog.csdn.net/yelbosh/article/details/7831812),主动刷新ListView的item视图可以主动调用方法notifyDataSetChanged();此时如果item布局有改变则ListView中的所有item都随之刷新。
  • FileViewHolder viewHolder;
    
    if(view==null){
    view=mInflater.inflate(R.layout.adapter_fileinfos,null);
    viewHolder=new FileViewHolder((TextView)view.findViewById(R.id.ecit_adapter_name),(TextView)view.findViewById(R.id.edit_adapter_size),(ImageView)view.findViewById(R.id.edit_adapter_img),(CheckBox)view.findViewById(R.id.edit_select));
    view.setTag(viewHolder);
    }else{
    viewHolder=(FileViewHolder)view.getTag();
    }
    
    FileInfo currentItem=mFileInfoList.get(pos);
    
    switch(mMode){
    case MODE_EDIT:
    viewHolder.mCheckBox.setVisibility(View.VISIBLE);//编辑状态下将CheckBox设置为可见
    if(currentItem.isChecked()){
    viewHolder.mCheckBox.setChecked(true);//如果当前的item在编辑状态下被选中,则将CheckBox的checked状态设为true
    }else{
    viewHolder.mCheckBox.setChecked(false);//如果没有被选中,则为false
    }
    break;
    case MODE_NORMAL:
    viewHolder.mCheckBox.setVisibility(View.GONE);//在正常模式下需要将CheckBox去掉
    .
    .
    .
    }

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值