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

来源:互联网 发布:seo 外链 编辑:程序博客网 时间:2024/06/14 08:13
  • 首先制作一个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"><CheckBoxandroid: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去掉...}

0 0