android ListView CheckBox全部选定并正确显示复选状态(非显示条目)
2012-10-31 22:51
585 查看
网上Google了一下,发现都是用自定义界面后,CheckBox.setChcked(true);这个方法只能选定显示条目的状态。再者当我们要GetAllChecked 条目时,根本不会记录那个已经选定(除了显示的),只能自己写了。这里主要用到了自定义一个CheckIDs 的ArrayList 来保存我确实已经选定的ID,注意只有ID才是唯一的(发现也就是data数据集的位置),没有细致考究,有空再考究。
package Main.JockeyCalendar.Control; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.CheckBox; import android.widget.SimpleAdapter; public class CheckBoxAdapter extends SimpleAdapter { private ArrayList< View> ListItemControls;//ListView View 的保存(一般只有屏幕显示的数目,因为是android 机制为了省资源是重用回View的) private ArrayList CheckedIDs;//这儿作为ItemD的保存(虽然是由getItemId方法获得,但发现是数据的Pos位置) private int mResource;//这里构造时保存资源 protected LayoutInflater mInflater;//加载的容器 public int CheckBoxID;//是筛选框的res id /** * 返回已经选定的条目数 * @return */ public int GetCheckedCounts(){ return CheckedIDs.size(); } /** * 设置列表中指定的控件为选定 * @param iStart 开始位置 * @param iEnd 结束位置 * @param IsChecked True是选定,False为不选定 */ public void SetCheckeds(int iStart,int iEnd,Boolean IsChecked){ if ( CheckBoxID<0) return; for (int i=0;i下面是绑定数据,代码。=iStart && i<=iEnd){ SetChecked(i,IsChecked); } } this.notifyDataSetChanged();//同步显示 } /** * 设置列表中指定的控件为选定 * @param pos 位置 * @param IsChecked True是选定,False为不选定 */ public void SetChecked(int pos,Boolean IsChecked){ Long item=this.getItemId(pos); if (CheckedIDs.contains(item)){//如果存在 if (IsChecked==false){//如果不是选定则移除 CheckedIDs.remove(item); } }else{//如果不存在 if(IsChecked) //如果是选定则添加 CheckedIDs.add(item); } if (pos<this.ListItemControls.size()){ View v=this.ListItemControls.get(pos); CheckBox ck=(CheckBox)v.findViewById(this.CheckBoxID); ck.setChecked(IsChecked); ck.toggle(); } } /** * 设置列表中指定的控件为选定 * @param ItemID * @param IsChecked True是选定,False为不选定 */ public void SetChecked(Long ItemID,Boolean IsChecked){ if (CheckedIDs.contains(ItemID)){//如果存在 if (IsChecked==false){//如果不是选定则移除 CheckedIDs.remove(ItemID); } }else{//如果不存在 if(IsChecked) //如果是选定则添加 CheckedIDs.add(ItemID); } } /** * 设置列表中指定的控件为选定 * @param al 要选定的列表数组 * @param IsChecked True是选定,False为不选定 */ public void SetCheckeds(ArrayList al,Boolean IsChecked){ if ( CheckBoxID<0) return; for (int i=0;i<this.getCount();i++){ if (al.contains(i)) SetChecked(i,IsChecked); } this.notifyDataSetChanged();//同步显示 } /** * 获得被选定的条目数据 * @return */ public List<? extends Map> GetCheckedItems(){ if (this.CheckedIDs==null||this.CheckedIDs.size()<=0)return null; ArrayList<HashMap> d=new ArrayList<HashMap>(); for (int i=0;i<CheckedIDs.size();i++){ Integer l=Integer.valueOf(String.valueOf(CheckedIDs.get(i))); d.add((HashMap) this.getItem(l)); } return d; } /** * 获得已选定的ID用“,”分隔 * @return */ public String GetCheckedIDs(){ ArrayList<HashMap> al=(ArrayList<HashMap>) GetCheckedItems(); String sid=""; if (al==null || al.size()<=0)return null; HashMap hm; for(int i=0;i0) sid=sid.substring(1); return sid; } /** * 构造函数 * @param context * @param data * @param resource * @param from * @param to */ public CheckBoxAdapter(Context context, List<? extends Map> data, int resource, String[] from, int[] to) { super(context, data, resource, from, to); mResource=resource; mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); ListItemControls=new ArrayList(); CheckedIDs=new ArrayList(); // TODO Auto-generated constructor stub } private OnClickListener CKOCL=new OnClickListener(){//CheckBox 的点击事件 public void onClick(View v) { // TODO Auto-generated method stub Long id=(Long)v.getTag(); CheckBox ck=(CheckBox)v; SetChecked (id,ck.isChecked()); } }; @Override public View getView(int pos, View cv, ViewGroup p) { if (cv == null) { cv = mInflater.inflate(mResource, p, false); if (ListItemControls.size()<=pos) ListItemControls.add(cv);//添加显示的View }else{ if (ListItemControls.size()>pos) ListItemControls.set(pos, cv);//把这个父路对象保存,调用某个ID时就用findViewbyID的方法 } Long ItemID=this.getItemId(pos);//获得ItemID CheckBox ck=(CheckBox)cv.findViewById(this.CheckBoxID); ck.setOnClickListener(CKOCL);//绑定 ck.setTag(ItemID);//利用Tag保存这个条目的ItemID ck.setChecked(CheckedIDs.contains(ItemID));//如果存在则为TRUE,不存在则是FALSE return super.getView(pos, cv, p); } }
//生成适配器的Item和动态数组对应的元素 CheckBoxAdapter sa = new CheckBoxAdapter(this,al,//数据源 R.layout.personsavelistitem,//ListItem的XML实现 //动态数组与ImageItem对应的子项 new String[] {"SkyLoc","Info"}, //ImageItem的XML文件里面的一个ImageView,两个TextView ID new int[] {R.id.txtTitle,R.id.txtInfo} ); sa.CheckBoxID=R.id.chkSelect; LV.setAdapter(sa); LV.setOnItemClickListener(new OnItemClickListener(){ public void onItemClick(AdapterView<?> parent, View view, int position, long id) { CheckBox ck=(CheckBox)view.findViewById(R.id.chkSelect); ck.toggle(); } });
相关文章推荐
- Android开发:setContentView切换界面,自定义带CheckBox的ListView显示SQlite条目-----实现
- android Listview中设置enable状态,显示点击的item
- Android 长按Listview显示CheckBox,实现批量删除
- 新东西009--Android ListView下CheckBox、Edittext状态记录
- 判断网络状态 fragment隐藏显示 xlistview多条目加载数据
- Android ListView CheckBox状态错乱
- Android完美解决ListView复用导致的Checkbox状态混乱问题
- android开发--listview中checkbox的选中状态
- AndroidのListView包含CheckBox时滑动丢失选中状态的解决
- Android---ListView(显示条目)
- [Android]ListView中包含Checkbox,ToggleButton时Checked状态丢失的问题解决
- Android ListView CheckBox状态错乱
- Android ListView在有checkbox的情况下上下滑动选中状态错误以及position错乱
- 让收藏、点赞的即时状态的交互正确的显示在ListView上
- android中ListView中嵌套GridView并且把GridView当中的内容全部显示出来的方法
- setContentView切换界面,自定义带CheckBox的ListView显示SQlite条目
- Android ListView CheckBox状态错乱(转)
- 解决android中listview中嵌套checkbox滑动时checkbox状态改变问题
- Android ListView CheckBox状态错乱
- Android实战简易教程-第五十一枪(ListView实现子控件的动态显示和隐藏、checkbox全选和反选)