android ListView CheckBox全部选定并正确显示复选状态(非显示条目)

本文介绍了一种自定义的CheckBox适配器实现方法,该方法通过保存选定ID的ArrayList来跟踪列表视图中被选中的项。文章详细解释了如何设置和获取选定项,并提供了一个具体的代码示例。

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

网上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();
 				
 				
 			} 
         });


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值