Android开发:BaseExpandableListAdapter的使用

来源:互联网 发布:必看的50部电影知乎 编辑:程序博客网 时间:2024/05/08 02:15

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

  

下面是实现步骤。

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;

}

}

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

<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;

}  

}

6、新建类PhoneGroupAdapter,实现BaseExpandableListAdapter。
package com.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;
}
}

 

 


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 爱派平板电脑密码忘了怎么办 电脑优酷下载总显示未知错误怎么办 文本文档打开时显字符丢失怎么办 系统文件过大无法放进u盘怎么办 淘宝上买的密钥激活不了怎么办 苹果手机玩游戏屏幕卡住不动怎么办 电脑系统安装好一排英文字怎么办 赴日签证申请表写错了怎么办 不知道自己想要做什么工作怎么办 三星note4微信出现闪退怎么办 魅蓝note6手机自动闪退怎么办 苹果6s系统内存占用量过大怎么办 想在一年通过会计初级和中级怎么办 特殊岗位退休档察写的力工怎么办 面试时期望工资说低了。怎么办 面试时期望薪资写低了怎么办 高考后比一模差了80分怎么办 戒了烟我不习惯没有你我怎么办 没有你我不习惯没有你我怎么办 做什么都没兴趣嫌麻烦怎么办 快递还在路上就确认收货了怎么办 微信显示时间与手机不符怎么办 微信提示银行卡预留手机不符怎么办 得了湿疹后吃了海鲜严重了怎么办 看到小区街道乱扔的垃圾你会怎么办 去韩国干服务员不会讲韩语怎么办 华为手机键盘变英文字母大了怎么办 淘宝申请售后卖家余额不足怎么办 发票名称少写了一个字怎么办 微博数量与实际数量不一致怎么办 在淘宝中要买的商品卖完了怎么办 病因写错了保险不报销怎么办? 上学期间保险名字写错了怎么办 塑料盆上的商标纸撕了胶怎么办 川航买机票名字错了两个字怎么办 买机票护照号码填错了怎么办 换旅行证给孩子改名字怎么办 浦发信用卡卡片名字印错了怎么办 公主工作很辛苦坚持不下去怎么办 在表格里怎么办名字转换成拼音 激素脸有黑头毛孔大该怎么办