BaseExpandableListAdapter的使用

资源来自于网络----------------------->

 

图片见附件

 

项目需要展示一个通讯簿,通讯簿中的手机号码是分组的,要求勾选组时,自动勾选组下的手机号码,实现效果如下:


我们这个实例主要讲的就是当点击一个分组的时候,分组里的所有人就默认的全部选中,有了这个功能我们在群发的时候就会给我们省去不少麻烦,这样我们就可以不用一个一个的选中了。那么我们就来看看这个效果是怎么样实现吗。

下面是实现步骤。

1、新建类PhoneListItem,用于表示分组中的每一个手机号码。

Java代码:

2011-4-7 15:07:02 上传
下载附件 (36.65 KB)

 

 

  1. package eoe.ydtf.android;

  2. public class PhoneListItem {

  3. public String phone,name;

  4. public boolean checked;

  5. public PhoneListItem(String _name,String _phone,boolean _checked){

  6. name=_name;

  7. phone=_phone;

  8. checked=_checked;

  9. }

  10. }
复制代码


2、新建布局文件phone_list_item.xml,用于定义分组下面的每一条手机记录的页面布局。

Java代码:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

  2. android:layout_width="fill_parent"
  3. android:layout_height="wrap_content"
  4. android:orientation="horizontal"
  5. android:minHeight="40px"
  6. android:layout_gravity="center_vertical">

  7. <CheckBox
  8. android:id="@+id/phone_check"
  9. android:focusable="false"
  10. android:layout_width="wrap_content"
  11. android:layout_height="wrap_content"
  12. android:layout_marginLeft="35px"
  13. android:checked="false"/>

  14. <TextView
  15. android:id="@+id/phone_name"
  16. android:layout_width="80dip"
  17. android:layout_height="wrap_content"
  18. android:layout_gravity="center_vertical" />

  19. <TextView
  20. android:id="@+id/phone_number"
  21. android:layout_width="wrap_content"
  22. android:layout_height="wrap_content"
  23. android:textColor="?android:attr/textColorPrimary"
  24. android:paddingLeft="10px"
  25. android:layout_gravity="center_vertical" />

  26. </LinearLayout>
复制代码

这个主要就是我们在这里布局,你想要什么样的效果都可以,这里就是上面效果图的布局

3、新建类PhoneGroup,用于表示一个分组。代码当中主要就是在一个分组里的内容,我们在用一个boolean值,这个就是说当你选中的时候是真,当你没有选中的时候是假,所以这个很主要,有了boolean值才能知道你是否选中。

Java代码:

  1. import java.util.List;

  2. public class PhoneGroup {

  3. public String title;

  4. private boolean checked;

  5. public List<PhoneListItem> children;

  6. public PhoneGroup(String title,boolean checked,List<PhoneListItem> children){

  7. this.title=title;

  8. setChecked(checked);

  9. this.children=children;

  10. }

  11. public boolean getChecked(){

  12. return checked;

  13. }

  14. public void setChecked(boolean b){

  15. checked=b;

  16. if(children!=null&&children.size()>0){//若children不为空,循环设置children的checked

  17. for(PhoneListItem each : children){

  18. each.checked=checked;

  19. }

  20. }

  21. }

  22. }
复制代码


4、新建Activity布局文件phone_browser.xml,用于定义通讯簿的展现页面。

Java代码:

  1. <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="vertical">

  5. <ExpandableListView
  6. android:id="@+id/phonelist"
  7. android:layout_width="fill_parent"
  8. android:layout_height="0dip"
  9. android:layout_weight="1" />

  10. </LinearLayout>
复制代码


5、新建类QxtPhoneSelect,用于呈现通讯簿的Activity页面。

Java代码:

  1. package eoe.ydtf;

  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import com.ydtf.android.PhoneGroupAdapter.ExpandableListHolder;
  5. import android.app.Activity;
  6. import android.os.Bundle;
  7. import android.view.View;

  8. import android.widget.ExpandableListView;

  9. public class QxtSelectPhone extends Activity implements

  10. ExpandableListView.OnGroupClickListener,ExpandableListView.OnChildClickListener{

  11. private List<PhoneGroup> groups;

  12. private PhoneGroupAdapter exlist_adapter = null;

  13. private ExpandableListView exlist;

  14. public void onCreate(Bundle savedInstanceState) {

  15. super.onCreate(savedInstanceState);

  16. //加载layout

  17. setContentView(R.layout.phone_browser);

  18. //取得listview

  19. exlist = (ExpandableListView) findViewById(R.id.phonelist);

  20. //调用init方法,这个方法主要是,初始化一些数据

  21. init();

  22. //构建expandablelistview的适配器

  23. exlist_adapter = new PhoneGroupAdapter(this, groups);

  24. exlist.setOnChildClickListener(this);

  25. exlist.setAdapter(exlist_adapter); //绑定视图-适配器

  26. }

  27. private void init() {

  28. groups = new ArrayList<PhoneGroup>();


  29. //构建List用作group1的子项

  30. List<PhoneListItem> group1_children = new ArrayList<PhoneListItem>();

  31. //往List中添加内容

  32. PhoneListItem item = new PhoneListItem("和文明","1308763994", false);

  33. group1_children.add(item);

  34. item = new PhoneListItem("黄文明","1308763994", false);

  35. group1_children.add(item);

  36. item = new PhoneListItem("王文明","1308763994", false);

  37. group1_children.add(item);

  38. //拼装成 PhoneGroup

  39. PhoneGroup phonegroup1=new PhoneGroup("group1",false,group1_children);

  40. //------把前面的代码复制一遍,再添加一个组group2

  41. //构建List用作group2的子项

  42. List<PhoneListItem> group2_children = new ArrayList<PhoneListItem>();

  43. //往List中添加内容

  44. item = new PhoneListItem("张文明","1589065423", false);

  45. group2_children.add(item);

  46. item = new PhoneListItem("李文明","1589065423", false);

  47. group2_children.add(item);

  48. item = new PhoneListItem("赵文明","1589065423", false);

  49. group2_children.add(item);

  50. //拼装成 PhoneGroup

  51. PhoneGroup phonegroup2=new PhoneGroup("group2",false,group2_children);

  52. //添加进groups数组

  53. groups.add(phonegroup1);

  54. groups.add(phonegroup2);

  55. }

  56. //当分组行背点击时,让分组呈现“选中/取消选中”状态。

  57. @Override
  58. public boolean onChildClick(ExpandableListView parent, View v,

  59. int groupPosition, int childPosition, long id) {

  60. PhoneGroupAdapter.ExpandableListHolder holder=(ExpandableListHolder) v.getTag();

  61. holder.chkChecked.setChecked(!holder.chkChecked.isChecked());

  62. groups.get(groupPosition).children.get(childPosition).checked=

  63. !groups.get(groupPosition).children.get(childPosition).checked;

  64. return false;

  65. }

  66. @Override
  67. public boolean onGroupClick(ExpandableListView parent, View v,

  68. int groupPosition, long id) {

  69. // groups.get(groupPosition).setChecked(!groups.get(groupPosition).getChecked());

  70. // exlist_adapter.notifyDataSetChanged();

  71. return false;

  72. }

  73. }
复制代码


6、新建类PhoneGroupAdapter,实现BaseExpandableListAdapter

Java代码:

  1. package eoe.ydtf.android;


  2. import java.util.List;
  3. import android.content.Context;
  4. import android.util.Log;
  5. import android.view.LayoutInflater;
  6. import android.view.View;
  7. import android.view.View.OnClickListener;
  8. import android.view.ViewGroup;
  9. import android.widget.BaseExpandableListAdapter;
  10. import android.widget.Button;
  11. import android.widget.CheckBox;
  12. import android.widget.CompoundButton;
  13. import android.widget.CompoundButton.OnCheckedChangeListener;
  14. import android.widget.TextView;


  15. public class PhoneGroupAdapter extends BaseExpandableListAdapter {
  16. class ExpandableListHolder { //定义一个内部类,用于保存listitem的3个子视图引用,2个textview和1个checkbox
  17. TextView tvName;
  18. TextView tvPhone;
  19. CheckBox chkChecked;
  20. }
  21. private Context context; //父activity
  22. private LayoutInflater mChildInflater; //用于加载listitem的布局xml
  23. private LayoutInflater mGroupInflater; //用于加载group的布局xml
  24. private List<PhoneGroup> groups; //所有group
  25. //构造方法:参数c - activity,参数group - 所有group
  26. public PhoneGroupAdapter(Context c,List<PhoneGroup> groups){
  27. context=c;
  28. mChildInflater = (LayoutInflater) context
  29. .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  30. mGroupInflater = (LayoutInflater) context
  31. .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  32. this.groups = groups;
  33. }
  34. @Override
  35. public Object getChild(int arg0, int arg1) {//根据组索引和item索引,取得listitem // TODO Auto-generated method stub
  36. return groups.get(arg0).children.get(arg1);
  37. }
  38. @Override
  39. public long getChildId(int arg0, int arg1) {//返回item索引
  40. return arg1;
  41. }
  42. @Override
  43. public int getChildrenCount(int groupPosition) {//根据组索引返回分组的子item数
  44. return groups.get(groupPosition).children.size();
  45. }
  46. @Override
  47. public Object getGroup(int groupPosition) {//根据组索引返回组
  48. return groups.get(groupPosition);
  49. }
  50. @Override
  51. public int getGroupCount() {//返回分组数
  52. return groups.size();
  53. }
  54. @Override
  55. public long getGroupId(int groupPosition) {//返回分组索引
  56. return groupPosition;
  57. }
  58. @Override
  59. public View getGroupView(int position, boolean isExpanded,
  60. View view, ViewGroup parent) {//根据组索引渲染"组视图"
  61. ExpandableListHolder holder = null; //清空临时变量holder
  62. if (view == null) { //判断view(即view是否已构建好)是否为空

  63. //若组视图为空,构建组视图。注意flate的使用,R.layout.browser_expandable_list_item代表了
  64. //已加载到内存的browser_expandable_list_item.xml文件
  65. view = mGroupInflater.inflate(
  66. R.layout.phone_list_item, null);
  67. //下面主要是取得组的各子视图,设置子视图的属性。用tag来保存各子视图的引用
  68. holder = new ExpandableListHolder();
  69. //从view中取得textView
  70. holder.tvName = (TextView) view.findViewById(R.id.phone_name);
  71. //从view中取得textview
  72. holder.tvPhone = (TextView) view.findViewById(R.id.phone_number);
  73. //从view中取得checkbox
  74. holder.chkChecked = (CheckBox) view
  75. .findViewById(R.id.phone_check);
  76. // holder.chkChecked.setEnabled(false);//禁用checkbox
  77. //把checkbox、textview的引用保存到组视图的tag属性中
  78. view.setTag(holder);
  79. } else { //若view不为空,直接从view的tag属性中获得各子视图的引用
  80. holder = (ExpandableListHolder) view.getTag();
  81. }
  82. //对应于组索引的组数据(模型)
  83. PhoneGroup info = this.groups.get(position);
  84. if (info != null) {
  85. //根据模型值设置textview的文本
  86. holder.tvName.setText(info.title);
  87. //根据模型值设置checkbox的checked属性
  88. holder.chkChecked.setChecked(info.getChecked());
  89. holder.chkChecked.setTag(info);
  90. holder.chkChecked.setOnClickListener(new OnClickListener(){
  91. @Override
  92. public void onClick(View v) {
  93. PhoneGroup group=(PhoneGroup)v.getTag();
  94. group.setChecked(!group.getChecked());
  95. notifyDataSetChanged();
  96. }
  97. });
  98. }
  99. // TODO Auto-generated method stub
  100. return view;
  101. }
  102. //行渲染方法
  103. @Override
  104. public View getChildView(int groupPosition, int childPosition,
  105. boolean isLastChild, View convertView, ViewGroup parent) {
  106. ExpandableListHolder holder = null; //清空临时变量
  107. if (convertView == null) { //若行未初始化
  108. //通过flater初始化行视图
  109. convertView = mChildInflater.inflate(
  110. R.layout.phone_list_item, null);
  111. //并将行视图的3个子视图引用放到tag中
  112. holder = new ExpandableListHolder();
  113. holder.tvName = (TextView) convertView
  114. .findViewById(R.id.phone_name);

  115. holder.tvPhone = (TextView) convertView.findViewById(R.id.phone_number);
  116. holder.chkChecked = (CheckBox) convertView
  117. .findViewById(R.id.phone_check);
  118. // holder.chkChecked.setEnabled(false);
  119. convertView.setTag(holder);
  120. } else { //若行已初始化,直接从tag属性获得子视图的引用
  121. holder = (ExpandableListHolder) convertView.getTag();
  122. }
  123. //获得行数据(模型)
  124. PhoneListItem info = this.groups.get(groupPosition)
  125. .children.get(childPosition);

  126. if (info != null) {
  127. //根据模型数据,设置行视图的控件值
  128. holder.tvName.setText(info.name);
  129. holder.tvPhone.setText(info.phone);
  130. holder.chkChecked.setChecked(info.checked);
  131. holder.chkChecked.setTag(info);
  132. holder.chkChecked.setOnClickListener(new OnClickListener(){
  133. @Override
  134. public void onClick(View v) {
  135. CheckBox check=(CheckBox)v;
  136. PhoneListItem item=(PhoneListItem)v.getTag();
  137. item.checked=!item.checked;
  138. // check.setChecked(!check.isChecked());
  139. }

  140. });
  141. }
  142. return convertView;
  143. }
  144. @Override
  145. public boolean hasStableIds() {//行是否具有唯一id
  146. return false;
  147. }
  148. @Override
  149. public boolean isChildSelectable(int groupPosition, int childPosition) {//行是否可选
  150. return true;
  151. }
  152. }

你可能感兴趣的:(BaseExpandableListAdapter的使用)