项目需要展示一个通讯簿,通讯簿中的手机号码是分组的,要求勾选组时,自动勾选组下的手机号码,实现效果如下:
<!--StartFragment--> 下面是实现步骤。
1、新建类PhoneListItem,用于表示分组中的每一个手机号码。
package com.ydtf.android;
public class PhoneListItem {
public String phone , name ;
public boolean checked ;
public PhoneListItem(String _name,String _phone, boolean _checked){
name =_name;
phone =_phone;
checked =_checked;
}
}
< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
android:layout_width = "fill_parent" android:layout_height = "wrap_content"
android:orientation = "horizontal" android:minHeight = "40px"
android:layout_gravity = "center_vertical" >
< CheckBox android:id = "@+id/phone_check" android:focusable = "false"
android:layout_width = "wrap_content" android:layout_height = "wrap_content"
android:layout_marginLeft = "35px" android:checked = "false" />
< TextView android:id = "@+id/phone_name" android:layout_width = "80dip"
android:layout_height = "wrap_content" android:layout_gravity = "center_vertical" />
< TextView android:id = "@+id/phone_number" android:layout_width = "wrap_content"
android:layout_height = "wrap_content" android:textColor = "?android:attr/textColorPrimary"
android:paddingLeft = "10px" android:layout_gravity = "center_vertical" />
</ LinearLayout >
3、新建类PhoneGroup,用于表示一个分组。
import java.util.List;
public class PhoneGroup {
public String title ;
private boolean checked ;
public List<PhoneListItem> children ;
public PhoneGroup(String title, boolean checked,List<PhoneListItem> children){
this . title =title;
setChecked(checked);
this . children =children;
}
public boolean getChecked(){
return checked ;
}
public void setChecked ( boolean b){
checked =b;
if ( children != null && children .size()>0){ //若children不为空,循环设置children的checked
for (PhoneListItem each : children ){
each. checked = checked ;
}
}
}
}
4、新建Activity布局文件phone_browser.xml,用于定义通讯簿的展现页面。
< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
android:layout_width = "fill_parent" android:layout_height = "fill_parent"
android:orientation = "vertical" >
< ExpandableListView android:id = "@+id/phonelist"
android:layout_width = "fill_parent" android:layout_height = "0dip"
android:layout_weight = "1" />
</ LinearLayout >
5、新建类QxtPhoneSelect,用于呈现通讯簿的Activity页面。
package com.ydtf.android;
import java.util.ArrayList;
import java.util.List;
import com.ydtf.android.PhoneGroupAdapter.ExpandableListHolder;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.ExpandableListView;
public class QxtSelectPhone extends Activity implements
ExpandableListView.OnGroupClickListener,ExpandableListView.OnChildClickListener{
private List<PhoneGroup> groups ;
private PhoneGroupAdapter exlist_adapter = null ;
private ExpandableListView exlist ;
public void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
//加载layout
setContentView(R.layout. phone_browser );
//取得 listview
exlist = (ExpandableListView) findViewById(R.id. phonelist );
//调用 init 方法,这个方法主要是,初始化一些数据
init();
//构建 expandablelistview 的适配器
exlist_adapter = new PhoneGroupAdapter( this , groups );
exlist .setOnChildClickListener( this );
exlist .setAdapter( exlist_adapter ); //绑定视图-适配器
}
private void init() {
groups = new ArrayList<PhoneGroup>();
//构建List用作group1的子项
List<PhoneListItem> group1_children = new ArrayList<PhoneListItem>();
//往List中添加内容
PhoneListItem item = new PhoneListItem( "和文明" , "1308763994" , false );
group1_children.add(item);
item = new PhoneListItem( "黄文明" , "1308763994" , false );
group1_children.add(item);
item = new PhoneListItem( "王文明" , "1308763994" , false );
group1_children.add(item);
//拼装成PhoneGroup
PhoneGroup phonegroup1= new PhoneGroup( "group1" , false ,group1_children);
//------把前面的代码复制一遍,再添加一个组group2
//构建List用作group2的子项
List<PhoneListItem> group2_children = new ArrayList<PhoneListItem>();
//往List中添加内容
item = new PhoneListItem( "张文明" , "1589065423" , false );
group2_children.add(item);
item = new PhoneListItem( "李文明" , "1589065423" , false );
group2_children.add(item);
item = new PhoneListItem( "赵文明" , "1589065423" , false );
group2_children.add(item);
//拼装成PhoneGroup
PhoneGroup phonegroup2= new PhoneGroup( "group2" , false ,group2_children);
//添加进groups数组
groups .add(phonegroup1);
groups .add(phonegroup2);
}
//当分组行背点击时,让分组呈现“选中/取消选中”状态。
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
PhoneGroupAdapter.ExpandableListHolder holder=(ExpandableListHolder) v.getTag();
holder. chkChecked .setChecked(!holder. chkChecked .isChecked());
groups .get(groupPosition). children .get( childPosition ). checked =
! groups .get(groupPosition). children .get(childPosition). checked ;
return false ;
}
@Override
public boolean onGroupClick(ExpandableListView parent, View v,
int groupPosition, long id) {
// groups.get(groupPosition).setChecked(!groups.get(groupPosition).getChecked());
// exlist_adapter.notifyDataSetChanged();
//
return false ;
}
}