读书人

BaseExpandableListAdapter的施用

发布时间: 2012-06-29 15:48:46 作者: rapoo

BaseExpandableListAdapter的使用

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

?

图片见附件

?

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


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

下面是实现步骤。

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

Java代码:


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,用于表示一个分组。代码当中主要就是在一个分组里的内容,我们在用一个boolean值,这个就是说当你选中的时候是真,当你没有选中的时候是假,所以这个很主要,有了boolean值才能知道你是否选中。

Java代码:


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页面。

Java代码:

    package eoe.ydtf;

    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;

    }

    }
复制代码


6、新建类PhoneGroupAdapter,实现BaseExpandableListAdapter

Java代码:

    package eoe.ydtf.android;


    import java.util.List;
    import android.content.Context;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.ViewGroup;
    import android.widget.BaseExpandableListAdapter;
    import android.widget.Button;
    import android.widget.CheckBox;
    import android.widget.CompoundButton;
    import android.widget.CompoundButton.OnCheckedChangeListener;
    import android.widget.TextView;


    public class PhoneGroupAdapter extends BaseExpandableListAdapter {
    class ExpandableListHolder { //定义一个内部类,用于保存listitem的3个子视图引用,2个textview和1个checkbox
    TextView tvName;
    TextView tvPhone;
    CheckBox chkChecked;
    }
    private Context context; //父activity
    private LayoutInflater mChildInflater; //用于加载listitem的布局xml
    private LayoutInflater mGroupInflater; //用于加载group的布局xml
    private List<PhoneGroup> groups; //所有group
    //构造方法:参数c - activity,参数group - 所有group
    public PhoneGroupAdapter(Context c,List<PhoneGroup> groups){
    context=c;
    mChildInflater = (LayoutInflater) context
    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    mGroupInflater = (LayoutInflater) context
    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    this.groups = groups;
    }
    @Override
    public Object getChild(int arg0, int arg1) {//根据组索引和item索引,取得listitem // TODO Auto-generated method stub
    return groups.get(arg0).children.get(arg1);
    }
    @Override
    public long getChildId(int arg0, int arg1) {//返回item索引
    return arg1;
    }
    @Override
    public int getChildrenCount(int groupPosition) {//根据组索引返回分组的子item数
    return groups.get(groupPosition).children.size();
    }
    @Override
    public Object getGroup(int groupPosition) {//根据组索引返回组
    return groups.get(groupPosition);
    }
    @Override
    public int getGroupCount() {//返回分组数
    return groups.size();
    }
    @Override
    public long getGroupId(int groupPosition) {//返回分组索引
    return groupPosition;
    }
    @Override
    public View getGroupView(int position, boolean isExpanded,
    View view, ViewGroup parent) {//根据组索引渲染"组视图"
    ExpandableListHolder holder = null; //清空临时变量holder
    if (view == null) { //判断view(即view是否已构建好)是否为空

    //若组视图为空,构建组视图。注意flate的使用,R.layout.browser_expandable_list_item代表了
    //已加载到内存的browser_expandable_list_item.xml文件
    view = mGroupInflater.inflate(
    R.layout.phone_list_item, null);
    //下面主要是取得组的各子视图,设置子视图的属性。用tag来保存各子视图的引用
    holder = new ExpandableListHolder();
    //从view中取得textView
    holder.tvName = (TextView) view.findViewById(R.id.phone_name);
    //从view中取得textview
    holder.tvPhone = (TextView) view.findViewById(R.id.phone_number);
    //从view中取得checkbox
    holder.chkChecked = (CheckBox) view
    .findViewById(R.id.phone_check);
    // holder.chkChecked.setEnabled(false);//禁用checkbox
    //把checkbox、textview的引用保存到组视图的tag属性中
    view.setTag(holder);
    } else { //若view不为空,直接从view的tag属性中获得各子视图的引用
    holder = (ExpandableListHolder) view.getTag();
    }
    //对应于组索引的组数据(模型)
    PhoneGroup info = this.groups.get(position);
    if (info != null) {
    //根据模型值设置textview的文本
    holder.tvName.setText(info.title);
    //根据模型值设置checkbox的checked属性
    holder.chkChecked.setChecked(info.getChecked());
    holder.chkChecked.setTag(info);
    holder.chkChecked.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View v) {
    PhoneGroup group=(PhoneGroup)v.getTag();
    group.setChecked(!group.getChecked());
    notifyDataSetChanged();
    }
    });
    }
    // TODO Auto-generated method stub
    return view;
    }
    //行渲染方法
    @Override
    public View getChildView(int groupPosition, int childPosition,
    boolean isLastChild, View convertView, ViewGroup parent) {
    ExpandableListHolder holder = null; //清空临时变量
    if (convertView == null) { //若行未初始化
    //通过flater初始化行视图
    convertView = mChildInflater.inflate(
    R.layout.phone_list_item, null);
    //并将行视图的3个子视图引用放到tag中
    holder = new ExpandableListHolder();
    holder.tvName = (TextView) convertView
    .findViewById(R.id.phone_name);

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

    if (info != null) {
    //根据模型数据,设置行视图的控件值
    holder.tvName.setText(info.name);
    holder.tvPhone.setText(info.phone);
    holder.chkChecked.setChecked(info.checked);
    holder.chkChecked.setTag(info);
    holder.chkChecked.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View v) {
    CheckBox check=(CheckBox)v;
    PhoneListItem item=(PhoneListItem)v.getTag();
    item.checked=!item.checked;
    // check.setChecked(!check.isChecked());
    }

    });
    }
    return convertView;
    }
    @Override
    public boolean hasStableIds() {//行是否具有唯一id
    return false;
    }
    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {//行是否可选
    return true;
    }
    }

读书人网 >移动开发

热点推荐