自定义ListView item包含checkbox实现单选和多选

时间:2021-11-25 10:42:02

CheckBox本为复选框,仍然可以当单选框用

自定义ListView item中包含一个textview 和checkbox,checkbox选中级别高于item,故在xml中进行屏蔽

单选方法:(该方法同样适用于radiobutton)


main.xml

[html] view plain copy
  1. <span style="font-size:14px;"><?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical"   
  6.     >  
  7.        <ImageView  
  8.         android:id="@+id/img"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="wrap_content"      
  11.         android:src="@drawable/triangle16blue"/>  
  12.   
  13.     <ListView  
  14.         android:id="@+id/lvGroup"  
  15.         android:layout_width="fill_parent"  
  16.         android:layout_height="fill_parent"  
  17.         android:background="@drawable/downbutton_corner"/>  
  18.   
  19. </LinearLayout></span>  
[html] view plain copy
  1. <span style="font-size:14px;"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="fill_parent"  
  3.     android:layout_height="fill_parent"  
  4.     android:orientation="horizontal" >  
  5.   
  6.     <TextView  
  7.         android:id="@+id/item_tv"  
  8.         android:textSize="18sp"  
  9.         android:layout_width="0dp"  
  10.         android:layout_height="wrap_content"  
  11.         android:layout_weight="1"  
  12.         android:gravity="center_vertical" />  
  13.     <CheckBox   
  14.         android:id="@+id/item_cb"  
  15.         android:layout_width="wrap_content"  
  16.         android:layout_height="wrap_content"  
  17.         android:focusable="false"  
  18.         android:clickable="false"  
  19.         android:focusableInTouchMode="false"  
  20.         android:gravity="center_vertical"/>  
  21.   
  22. </LinearLayout></span>  

MainActivity.java

[java] view plain copy
  1. public class MainActivity extends Activity {  
  2.     private static final String TAG = "MainActivity";  
  3.     private ListView listView;  
  4.     private ArrayList<String> groups;  
  5.     @Override  
  6.     public void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.main);  
  9.         listView = (ListView) this.findViewById(R.id.list);  
  10.         groups = new ArrayList<String>();  
  11.                 groups.add("11");  
  12.                 groups.add("22");  
  13.                 groups.add("33");  
  14.                 groups.add("44");  
  15.                 groups.add("55");  
  16.                 groups.add("66");  
  17.                 groups.add("77");  
  18.         GroupAdapter adapter = new GroupAdapter(this,groups);  
  19.         listView.setAdapter(adapter);  
  20.         listView.setOnItemClickListener(listItemClickListener);  
  21.         OnItemClickListener listItemClickListener=new OnItemClickListener() {  
  22.   
  23.             @Override  
  24.             public void onItemClick(AdapterView<?> parent, View view, int position,  
  25.                     long id) {  
  26.                 //// 取得ViewHolder对象,这样就省去了通过层层的findViewById去实例化我们需要的cb实例的步骤    
  27.                 ViewHolder viewHolder=(ViewHolder)view.getTag();                          
  28.                 viewHolder.cb.toggle();// 把CheckBox的选中状态改为当前状态的反,gridview确保是单一选中  
  29.             }  
  30.         };  
  31.     }   
  32.     }  


GroupAdapter.java

[java] view plain copy
  1. <span style="font-size:14px;">public class GroupAdapter extends BaseAdapter {  
  2.     private Activity activity;//上下文  
  3.     private ArrayList<String> list;  
  4.       
  5.     private LayoutInflater inflater=null;//导入布局  
  6.     private int temp=-1;  
  7.       
  8.     public GroupAdapter(Activity context, ArrayList<String> list) {  
  9.         this.activity = context;  
  10.         this.list = list;  
  11.         inflater=LayoutInflater.from(context);  
  12.           
  13.     }  
  14.   
  15.     @Override  
  16.     public int getCount() {  
  17.         return list.size();  
  18.     }  
  19.   
  20.     @Override  
  21.     public Object getItem(int position) {  
  22.           
  23.         return list.get(position);  
  24.     }  
  25.   
  26.     @Override  
  27.     public long getItemId(int position) {  
  28.         // TODO Auto-generated method stub  
  29.         return position;  
  30.     }  
  31.     //listview每显示一行数据,该函数就执行一次  
  32.     @Override  
  33.     public View getView(int position, View convertView, ViewGroup parent) {  
  34.         ViewHolder holder=null;    
  35.         if (convertView==null) {//当第一次加载ListView控件时  convertView为空  
  36.             convertView=inflater.inflate(R.layout.group_item_view, null);//所以当ListView控件没有滑动时都会执行这条语句  
  37.             holder=new ViewHolder();  
  38.             holder.tv=(TextView)convertView.findViewById(R.id.item_tv);  
  39.             holder.cb=(CheckBox)convertView.findViewById(R.id.item_cb);  
  40.             convertView.setTag(holder);//为view设置标签  
  41.                        
  42.         }  
  43.         else{//取出holder  
  44.             holder=(ViewHolder) convertView.getTag();//the Object stored in this view as a tag  
  45.         }  
  46.         //设置list的textview显示  
  47.         holder.tv.setTextColor(Color.WHITE);  
  48.         holder.tv.setText(list.get(position));  
  49.         // 根据isSelected来设置checkbox的选中状况  
  50.           
  51.         holder.cb.setId(position);//对checkbox的id进行重新设置为当前的position  
  52.         holder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {  
  53.             //把上次被选中的checkbox设为false  
  54.             @Override  
  55.             public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {  
  56.                 if(isChecked){//实现checkbox的单选功能,同样适用于radiobutton  
  57.                     if(temp!=-1){  
  58.                         //找到上次点击的checkbox,并把它设置为false,对重新选择时可以将以前的关掉  
  59.                         CheckBox tempCheckBox=(CheckBox)activity.findViewById(temp);  
  60.                         if(tempCheckBox!=null)  
  61.                             tempCheckBox.setChecked(false);  
  62.                     }  
  63.                     temp=buttonView.getId();//保存当前选中的checkbox的id值         
  64.                 }  
  65.             }  
  66.         });  
  67.         //System.out.println("temp:"+temp);  
  68.         //System.out.println("position:"+position);  
  69.         if(position==temp)//比对position和当前的temp是否一致  
  70.             holder.cb.setChecked(true);  
  71.         else   
  72.             holder.cb.setChecked(false);  
  73.         return convertView;  
  74.     }  
  75.     static class ViewHolder {  
  76.         TextView tv;  
  77.         CheckBox cb;  
  78.     }  
  79. }</span>  


listview checkbox实现多选框

MainAcitvity.java

[java] view plain copy
  1. public class MainActivity extends Activity {  
  2.     private static final String TAG = "MainActivity";  
  3.     private ListView listView;  
  4.     private ArrayList<String> groups;  
  5.     @Override  
  6.     public void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.main);  
  9.         listView = (ListView) this.findViewById(R.id.list);  
  10.         groups = new ArrayList<String>();  
  11.                 groups.add("11");  
  12.                 groups.add("22");  
  13.                 groups.add("33");  
  14.                 groups.add("44");  
  15.                 groups.add("55");  
  16.                 groups.add("66");  
  17.                 groups.add("77");  
  18.         GroupAdapter adapter = new GroupAdapter(this,groups);  
  19.         listView.setAdapter(adapter);  
  20.         listView.setOnItemClickListener(listItemClickListener);  
  21.         OnItemClickListener listItemClickListener=new OnItemClickListener() {  
  22.   
  23.             @Override  
  24.             public void onItemClick(AdapterView<?> parent, View view, int position,  
  25.                     long id) {  
  26.                 //// 取得ViewHolder对象,这样就省去了通过层层的findViewById去实例化我们需要的cb实例的步骤    
  27.                 ViewHolder viewHolder=(ViewHolder)view.getTag();                          
  28.                 viewHolder.cb.toggle();// 把CheckBox的选中状态改为当前状态的反,gridview确保是单一选中  
  29.                 <span style="color:#ff6666;">GroupAdapter.getIsSelected().put(position, viewHolder.cb.isChecked());//将CheckBox的选中状况记录下来 </span>  
  30.             }  
  31.         };  
  32.     }   
  33.  }  

GroupAdapter.java

[java] view plain copy
  1. public class GroupAdapter extends BaseAdapter {  
  2.     <span style="color:#ff0000;">private Context context;//上下文</span>  
  3.     private ArrayList<String> list;  
  4.     //控制CheckBox选中情况  
  5.     private static HashMap<Integer,Boolean> isSelected;  
  6.     private LayoutInflater inflater=null;//导入布局  
  7.       
  8.       
  9.     public GroupAdapter(<span style="color:#ff0000;">Context context,</span> ArrayList<String> list) {  
  10.         <span style="color:#ff0000;">this.context = context;</span>  
  11.         this.list = list;  
  12.         inflater=LayoutInflater.from(context);  
  13.         isSelected=new HashMap<Integer, Boolean>();  
  14.         initData();  
  15.     }  
  16.     private void initData(){//初始化isSelected的数据  
  17.         for(int i=0;i<list.size();i++){  
  18.             getIsSelected().put(i,false);  
  19.               
  20.         }     
  21.     }  
  22.   
  23.     @Override  
  24.     public int getCount() {  
  25.         return list.size();  
  26.     }  
  27.   
  28.     @Override  
  29.     public Object getItem(int position) {  
  30.           
  31.         return list.get(position);  
  32.     }  
  33.   
  34.     @Override  
  35.     public long getItemId(int position) {  
  36.         // TODO Auto-generated method stub  
  37.         return position;  
  38.     }  
  39.     //listview每显示一行数据,该函数就执行一次  
  40.     @Override  
  41.     public View getView(int position, View convertView, ViewGroup parent) {  
  42.         ViewHolder holder=null;    
  43.         if (convertView==null) {//当第一次加载ListView控件时  convertView为空  
  44.             convertView=inflater.inflate(R.layout.group_item_view, null);//所以当ListView控件没有滑动时都会执行这条语句  
  45.             holder=new ViewHolder();  
  46.             holder.tv=(TextView)convertView.findViewById(R.id.item_tv);  
  47.             holder.cb=(CheckBox)convertView.findViewById(R.id.item_cb);  
  48.             convertView.setTag(holder);//为view设置标签  
  49.                        
  50.         }  
  51.         else{//取出holder  
  52.             holder=(ViewHolder) convertView.getTag();//the Object stored in this view as a tag  
  53.         }  
  54.         //设置list的textview显示  
  55.         holder.tv.setTextColor(Color.WHITE);  
  56.         holder.tv.setText(list.get(position));  
  57.         // 根据isSelected来设置checkbox的选中状况  
  58.         <span style="color:#ff0000;">holder.cb.setChecked(getIsSelected().get(position));</span>      
  59.         return convertView;  
  60.     }  
  61.     static class ViewHolder {  
  62.         TextView tv;  
  63.         CheckBox cb;  
  64.     }  
  65.     public static HashMap<Integer, Boolean>getIsSelected(){  
  66.         return isSelected;  
  67.     }  
  68.     public static void setIsSelected(HashMap<Integer, Boolean> isSelected){  
  69.         GroupAdapter.isSelected=isSelected;  
  70.     }  
  71.   
  72. }  
其中,getview负责显示每一行listview item,每显示一行就执行一次getview,

若要单选,必须保存当前选中的checkbox的position值,与listview 的每一个item的position进行比较,相同时才设置checkbox ischeck=true;

只有checkbox的setOnCheckChangeListener可以做到这点,保存上一次点击的position值,对checkbox的id值重新设置.temp保存该id值.

getview负责显示数据,onitemselectedlistener负责发送消息,提取数据,处理数据

 源码下载
参考:http://blog.csdn.net/notice520/article/details/7266896

http://blog.csdn.net/jdsjlzx/article/details/6969405

http://www.devdiv.com/forum.php?mod=viewthread&tid=85251