Android中ListView结合CheckBox判断选中项

本文主要实现在自定义的ListView布局中加入CheckBox控件,通过判断用户是否选中CheckBox来对ListView的选中项进行相应的操作。通过一个Demo来展示该功能,选中ListView中的某一项,然后点击Button按钮来显示选中了哪些项。

[1] 程序结构图如下:


其中Person.java是实体类,MainActivity.java是Activity组件类。listitem.xml是自定义的列表每项布局文件。

[2] listitem.xml布局文件源码如下:

[html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:orientation="vertical"
  5. android:layout_width="fill_parent"
  6. android:layout_height="fill_parent">
  7. <LinearLayout
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:orientation="horizontal"
  11. android:descendantFocusability="blocksDescendants">
  12. <CheckBox
  13. android:id="@+id/list.select"
  14. android:layout_width="wrap_content"
  15. android:layout_height="wrap_content"/>
  16. <TextView
  17. android:id="@+id/list.name"
  18. android:layout_width="fill_parent"
  19. android:layout_height="wrap_content"
  20. android:layout_weight="1"
  21. android:text="Name"
  22. android:layout_gravity="center"
  23. android:textSize="20dp"
  24. android:layout_marginLeft="10dp"/>
  25. <TextView
  26. android:id="@+id/list.address"
  27. android:layout_width="fill_parent"
  28. android:layout_height="wrap_content"
  29. android:layout_weight="1"
  30. android:text="Address"
  31. android:layout_gravity="center"
  32. android:textSize="20dp"/>
  33. </LinearLayout>
  34. </LinearLayout>

[3] main.xml布局文件源码如下: [html] view plain copy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent">
  6. <Button
  7. android:id="@+id/show"
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:text="Show"/>
  11. <ListView
  12. android:id="@+id/lvperson"
  13. android:layout_width="fill_parent"
  14. android:layout_height="fill_parent"/>
  15. </LinearLayout>

[4] Person.java实体类源码如下: [html] view plain copy
  1. packagecom.andyidea.bean;
  2. publicclassPerson{
  3. privateStringname;
  4. privateStringaddress;
  5. publicStringgetName(){
  6. returnname;
  7. }
  8. publicvoidsetName(Stringname){
  9. this.name=name;
  10. }
  11. publicStringgetAddress(){
  12. returnaddress;
  13. }
  14. publicvoidsetAddress(Stringaddress){
  15. this.address=address;
  16. }
  17. }

[5] MainActivity.java类源码如下: [html] view plain copy
  1. packagecom.andyidea.listview;
  2. importjava.util.ArrayList;
  3. importjava.util.HashMap;
  4. importjava.util.List;
  5. importcom.andyidea.bean.Person;
  6. importandroid.app.Activity;
  7. importandroid.app.AlertDialog;
  8. importandroid.content.Context;
  9. importandroid.os.Bundle;
  10. importandroid.util.Log;
  11. importandroid.view.LayoutInflater;
  12. importandroid.view.View;
  13. importandroid.view.ViewGroup;
  14. importandroid.widget.BaseAdapter;
  15. importandroid.widget.Button;
  16. importandroid.widget.CheckBox;
  17. importandroid.widget.ListView;
  18. importandroid.widget.TextView;
  19. publicclassMainActivityextendsActivity{
  20. Buttonshow;
  21. ListViewlv;
  22. List<Person>persons=newArrayList<Person>();
  23. ContextmContext;
  24. MyListAdapteradapter;
  25. List<Integer>listItemID=newArrayList<Integer>();
  26. /**Calledwhentheactivityisfirstcreated.*/
  27. @Override
  28. publicvoidonCreate(BundlesavedInstanceState){
  29. super.onCreate(savedInstanceState);
  30. setContentView(R.layout.main);
  31. mContext=getApplicationContext();
  32. show=(Button)findViewById(R.id.show);
  33. lv=(ListView)findViewById(R.id.lvperson);
  34. initPersonData();
  35. adapter=newMyListAdapter(persons);
  36. lv.setAdapter(adapter);
  37. show.setOnClickListener(newView.OnClickListener(){
  38. @Override
  39. publicvoidonClick(Viewv){
  40. listItemID.clear();
  41. for(inti=0;i<adapter.mChecked.size();i++){
  42. if(adapter.mChecked.get(i)){
  43. listItemID.add(i);
  44. }
  45. }
  46. if(listItemID.size()==0){
  47. AlertDialog.Builderbuilder1=newAlertDialog.Builder(MainActivity.this);
  48. builder1.setMessage("没有选中任何记录");
  49. builder1.show();
  50. }else{
  51. StringBuildersb=newStringBuilder();
  52. for(inti=0;i<listItemID.size();i++){
  53. sb.append("ItemID="+listItemID.get(i)+".");
  54. }
  55. AlertDialog.Builderbuilder2=newAlertDialog.Builder(MainActivity.this);
  56. builder2.setMessage(sb.toString());
  57. builder2.show();
  58. }
  59. }
  60. });
  61. }
  62. /**
  63. *模拟数据
  64. */
  65. privatevoidinitPersonData(){
  66. PersonmPerson;
  67. for(inti=1;i<=12;i++){
  68. mPerson=newPerson();
  69. mPerson.setName("Andy"+i);
  70. mPerson.setAddress("GuangZhou"+i);
  71. persons.add(mPerson);
  72. }
  73. }
  74. //自定义ListView适配器
  75. classMyListAdapterextendsBaseAdapter{
  76. List<Boolean>mChecked;
  77. List<Person>listPerson;
  78. HashMap<Integer,View>map=newHashMap<Integer,View>();
  79. publicMyListAdapter(List<Person>list){
  80. listPerson=newArrayList<Person>();
  81. listlistPerson=list;
  82. mChecked=newArrayList<Boolean>();
  83. for(inti=0;i<list.size();i++){
  84. mChecked.add(false);
  85. }
  86. }
  87. @Override
  88. publicintgetCount(){
  89. returnlistPerson.size();
  90. }
  91. @Override
  92. publicObjectgetItem(intposition){
  93. returnlistPerson.get(position);
  94. }
  95. @Override
  96. publiclonggetItemId(intposition){
  97. returnposition;
  98. }
  99. @Override
  100. publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
  101. Viewview;
  102. ViewHolderholder=null;
  103. if(map.get(position)==null){
  104. Log.e("MainActivity","position1="+position);
  105. LayoutInflatermInflater=(LayoutInflater)mContext
  106. .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  107. view=mInflater.inflate(R.layout.listitem,null);
  108. holder=newViewHolder();
  109. holder.selected=(CheckBox)view.findViewById(R.id.list_select);
  110. holder.name=(TextView)view.findViewById(R.id.list_name);
  111. holder.address=(TextView)view.findViewById(R.id.list_address);
  112. finalintp=position;
  113. map.put(position,view);
  114. holder.selected.setOnClickListener(newView.OnClickListener(){
  115. @Override
  116. publicvoidonClick(Viewv){
  117. CheckBoxcb=(CheckBox)v;
  118. mChecked.set(p,cb.isChecked());
  119. }
  120. });
  121. view.setTag(holder);
  122. }else{
  123. Log.e("MainActivity","position2="+position);
  124. view=map.get(position);
  125. holder=(ViewHolder)view.getTag();
  126. }
  127. holder.selected.setChecked(mChecked.get(position));
  128. holder.name.setText(listPerson.get(position).getName());
  129. holder.address.setText(listPerson.get(position).getAddress());
  130. returnview;
  131. }
  132. }
  133. staticclassViewHolder{
  134. CheckBoxselected;
  135. TextViewname;
  136. TextViewaddress;
  137. }
  138. }

[6] 程序运行后的结果如下:

文章出处:http://blog.csdn.net/cjjky/article/details/6967219


更多相关文章

  1. 一款常用的 Squid 日志分析工具
  2. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  3. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  4. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  5. [原创] 在Android系统使用socket在framework和native之间通信
  6. Android使用Fragment实现底部导航栏
  7. Android* 教程:使用英特尔® 线程构建模块编写多线程应用
  8. Android远程Service(AIDL)的简单实例
  9. Android源代码加入SDK,在程序中查看android源代码

随机推荐

  1. Android(安卓)自定义viewpager选中点
  2. Android(安卓)中一些小经验总结
  3. 【十三】注入框架RoboGuice使用:(Logging
  4. Volley二次封装,实现网络请求缓存
  5. android addJavascriptInterface 不能生
  6. Android不同分辨率的Drawable资源配置
  7. Android下在onCreate方法中获取TextView
  8. Windows下,Ant自动化编译Android项目具体
  9. Android高级的总结
  10. 【Android(安卓)高性能音频】AAudio 音频