首页 > 代码库 > Android的ExpandableListView的学习

Android的ExpandableListView的学习

最近在公司做项目,有一个小模块,需要用到ExpandableListView这个控件,所以在工作中边学习边工作。根据需求,在进入ExpandableLisView的时候默认展开第一组,需要用到这个属性,expandableListView.expandGroup(0);

在ExpandableListView中,当点击一个组展开时,其他展开的组是不自动关上的,这需要在监听事件中处理一下:

@Override
 public void onGroupExpand(int groupPosition) {
  // TODO Auto-generated method stub
  for (int i = 0, count = expandableListView.getExpandableListAdapter()
    .getGroupCount(); i < count; i++) {
   if (groupPosition != i) {// 关闭其他分组
    expandableListView.collapseGroup(i);
   }
  }
 }

还有一个地方需要注意的就是在Adapter的getChildrenCount(int groupPosition)方法,要return child.get(groupPosition).size(),否则会在点击组得时候,报数组越界的问题。

下边是部分代码:

MainActivity.java

 

 1 package com.example.expandablelistviewdemo; 2  3 import java.util.ArrayList; 4 import java.util.List; 5 import android.app.Activity; 6 import android.os.Bundle; 7 import android.widget.ExpandableListView; 8 import android.widget.ExpandableListView.OnGroupExpandListener; 9 10 public class MainActivity extends Activity implements OnGroupExpandListener {11     private ExpandableListView expandableListView;12     private ServiceStationAdapter adapter;13     private ArrayList<String> groupList = new ArrayList<String>();14     private ArrayList<List<ServerStation>> childList = new ArrayList<List<ServerStation>>();15 16     @Override17     protected void onCreate(Bundle savedInstanceState) {18         // TODO Auto-generated method stub19         super.onCreate(savedInstanceState);20         setContentView(R.layout.activity_main);21         expandableListView = (ExpandableListView) findViewById(R.id.expandableListView1);22 23         setDate();24     }25 26     /**27      * 填充数据28      * 29      */30     private void setDate() {31         List<ServerStation> list1 = new ArrayList<ServerStation>();32         for (int i = 0; i < 5; i++) {33             ServerStation serverStation = new ServerStation();34             serverStation.setAddressDiscri("北京丰台区甲23号" + "," + i);35             serverStation.setFaxs("010-1234556" + "," + i);36             serverStation.setPhones("010-74123412" + "," + i);37             list1.add(serverStation);38         }39 40         addDate("北京", list1);41         List<ServerStation> list2 = new ArrayList<ServerStation>();42         for (int i = 0; i < 3; i++) {43             ServerStation serverStation = new ServerStation();44             serverStation.setAddressDiscri("河北省衡水市大风路23号5栋3门302室" + "," + i);45             serverStation.setFaxs("0313-1234556" + "," + i);46             serverStation.setPhones("0313-74123412" + "," + i);47             list2.add(serverStation);48         }49         addDate("河北", list2);50         expandableListView.setGroupIndicator(null);51         adapter = new ServiceStationAdapter(MainActivity.this, groupList,52                 childList);53         expandableListView.setAdapter(adapter);54         // 展开一组,关闭其他组55         expandableListView.setOnGroupExpandListener(MainActivity.this);56         // 默认展开第一项57         expandableListView.expandGroup(0);58 59     }60 61     @Override62     public void onGroupExpand(int groupPosition) {63         // TODO Auto-generated method stub64         for (int i = 0, count = expandableListView.getExpandableListAdapter()65                 .getGroupCount(); i < count; i++) {66             if (groupPosition != i) {// 关闭其他分组67                 expandableListView.collapseGroup(i);68             }69         }70     }71 72     /**73      * 添加数据信息74      * 75      * @param g76      * @param c77      */78     private void addDate(String g, List<ServerStation> c) {79         groupList.add(g);80         List<ServerStation> list = new ArrayList<ServerStation>();81         for (int i = 0; i < c.size(); i++) {82             list.add(c.get(i));83         }84         childList.add(list);85     }86 87 }
View Code

 

ServiceStationAdapter.java

  1 package com.example.expandablelistviewdemo;  2   3 import java.util.List;  4   5   6 import android.app.AlertDialog;  7 import android.content.Context;  8 import android.content.DialogInterface;  9 import android.content.Intent; 10 import android.net.Uri; 11 import android.view.LayoutInflater; 12 import android.view.View; 13 import android.view.View.OnClickListener; 14 import android.view.ViewGroup; 15 import android.widget.BaseExpandableListAdapter; 16 import android.widget.ImageView; 17 import android.widget.LinearLayout; 18 import android.widget.TextView; 19  20 /** 21  * expandableListView 22  *  23  */ 24 public class ServiceStationAdapter extends BaseExpandableListAdapter { 25     private Context context; 26     private List<String> group; 27     private List<List<ServerStation>> child; 28  29     public ServiceStationAdapter(Context context, List<String> group, 30             List<List<ServerStation>> child) { 31         this.context = context; 32         this.group = group; 33         this.child = child; 34     } 35  36     @Override 37     public int getGroupCount() { 38         return group.size(); 39     } 40  41     @Override 42     public int getChildrenCount(int groupPosition) { 43         // return child.size(); 44         return child.get(groupPosition).size(); 45     } 46  47     @Override 48     public Object getGroup(int groupPosition) { 49         return group.get(groupPosition); 50     } 51  52     @Override 53     public Object getChild(int groupPosition, int childPosition) { 54         return child.get(childPosition).get(childPosition); 55     } 56  57     @Override 58     public long getGroupId(int groupPosition) { 59         return groupPosition; 60     } 61  62     @Override 63     public long getChildId(int groupPosition, int childPosition) { 64         return childPosition; 65     } 66  67     @Override 68     public boolean hasStableIds() { 69         return false; 70     } 71  72     /** 73      * 修改listview组得样式 group 74      */ 75     @Override 76     public View getGroupView(int groupPosition, boolean isExpanded, 77             View convertView, ViewGroup parent) { 78         ViewHolder holder; 79         if (convertView == null) { 80             convertView = LayoutInflater.from(context).inflate( 81                     R.layout.expandlistview_group_layout, null); 82             holder = new ViewHolder(); 83             holder.tvCity = (TextView) convertView.findViewById(R.id.tv_city); 84             holder.imgArrow = (ImageView) convertView 85                     .findViewById(R.id.imageView); 86             convertView.setTag(holder); 87         } else { 88             holder = (ViewHolder) convertView.getTag(); 89         } 90         if (isExpanded) { 91             holder.imgArrow 92                     .setBackgroundResource(R.drawable.down_selected_icon); 93         } else { 94             holder.imgArrow.setBackgroundResource(R.drawable.up_selected_icon); 95         } 96         holder.tvCity.setText(group.get(groupPosition)); 97         return convertView; 98  99     }100 101     /**102      * child103      */104     @Override105     public View getChildView(int groupPosition, int childPosition,106             boolean isLastChild, View convertView, ViewGroup parent) {107         ViewHolder holder;108         if (convertView == null) {109             convertView = LayoutInflater.from(context).inflate(110                     R.layout.expandlistview_child_layout, null);111             holder = new ViewHolder();112             holder.tvAddress = (TextView) convertView113                     .findViewById(R.id.tv_address);114             holder.tvFax = (TextView) convertView.findViewById(R.id.tv_fax);115             holder.tvTel = (TextView) convertView.findViewById(R.id.tv_tel);116             holder.telLayout = (LinearLayout) convertView117                     .findViewById(R.id.tel_layout);118             convertView.setTag(holder);119         } else {120             holder = (ViewHolder) convertView.getTag();121         }122         String address = child.get(groupPosition).get(childPosition)123                 .getAddressDiscri();124         holder.tvAddress.setText(address);125         String fax = child.get(groupPosition).get(childPosition).getFaxs();126         if ("".equals(fax)) {127             holder.tvFax.setText("暂无传真信息");128         } else {129             holder.tvFax.setText(fax);130         }131 132         String mobile = child.get(groupPosition).get(childPosition).getPhones();133         if ("".equals(mobile)) {134             holder.tvTel.setText("暂无电话信息");135         } else {136             holder.tvTel.setText(mobile);137         }138 139         holder.telLayout.setOnClickListener(new MyclickListener(groupPosition,140                 childPosition));141         return convertView;142     }143 144     class ViewHolder {145         TextView tvCity, tvAddress, tvFax, tvTel;146         ImageView imgArrow;147         LinearLayout telLayout;148 149     }150 151     @Override152     public boolean isChildSelectable(int groupPosition, int childPosition) {153         return false;154     }155 156     class MyclickListener implements OnClickListener {157         int groupPosition, childPosition;158 159         public MyclickListener(int groupIndex, int childIndex) {160             // TODO Auto-generated constructor stub161 162             this.groupPosition = groupIndex;163             this.childPosition = childIndex;164         }165 166         @Override167         public void onClick(View v) {168 169             // showCustomerService(child.get(groupPosition).get(childPosition)170             // .getTel());171             showDialog(child.get(groupPosition).get(childPosition).getPhones(),172                     "拨打电话");173         }174     }175 176     /**177      * 178      * @Title: showDialog179      * @Description: TODO(这里用一句话描述这个方法的作用)180      * @param: @param visible 控件的显隐181      * @param: @param message dialog内容显示182      * @param: @param titleStr dialog的标题183      * @param: @param id 根据id不同设置dialog确定按钮显示184      * @return: void 返回类型185      * @date: 2014-9-17 下午4:40:10186      */187     public void showDialog(final String message, final String titleStr) {188         AlertDialog.Builder builder = new AlertDialog.Builder(context);189         builder.setTitle(titleStr);190         builder.setMessage(message);191         builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {192 193             @Override194             public void onClick(DialogInterface dialog, int which) {195                 // TODO Auto-generated method stub196                 Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:"197                         + message));198                 context.startActivity(intent);199                 dialog.dismiss();200             }201 202         });203 204         builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {205 206             @Override207             public void onClick(DialogInterface dialog, int which) {208                 // TODO Auto-generated method stub209                 dialog.dismiss();210             }211         });212         213         builder.create().show();214     }215 216 }
View Code

 

ServiceStation.java

 1 package com.example.expandablelistviewdemo; 2  3 import java.io.Serializable; 4  5  6 public class ServerStation implements Serializable { 7     /** 8      */ 9     private static final long serialVersionUID = 7492110209741256694L;10     private String addressDiscri = "";// 详细地址11     private String phones = "";// 电话12     private String faxs = "";// 传真13     public String getAddressDiscri() {14         return addressDiscri;15     }16 17     public void setAddressDiscri(String addressDiscri) {18         this.addressDiscri = addressDiscri;19     }20 21     public String getPhones() {22         return phones;23     }24 25     public void setPhones(String phones) {26         this.phones = phones;27     }28 29     public String getFaxs() {30         return faxs;31     }32 33     public void setFaxs(String faxs) {34         this.faxs = faxs;35     }36 }
View Code

布局文件

activity_main.xml

 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3     android:layout_width="match_parent" 4     android:layout_height="match_parent" 5     android:background="#f9f9f9" 6     android:orientation="vertical" > 7  8     <ExpandableListView 9         android:id="@+id/expandableListView1"10         android:layout_width="match_parent"11         android:layout_height="wrap_content" >12     </ExpandableListView>13 14 </LinearLayout>
View Code

expandlistview_group_layout.xml

 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3     android:layout_width="match_parent" 4     android:layout_height="match_parent" 5     android:orientation="vertical" > 6  7     <RelativeLayout 8         android:padding="10dp" 9         android:gravity="center_vertical"10         android:layout_width="match_parent"11         android:layout_height="40dp" >12 13         <TextView14             android:textColor="@android:color/black"15             android:textSize="10sp"16             android:id="@+id/tv_city"17             android:layout_width="wrap_content"18             android:layout_height="wrap_content"19             android:layout_alignParentLeft="true"20             android:text="北京" />21 22         <ImageView23             android:id="@+id/imageView"24             android:layout_width="wrap_content"25             android:layout_height="wrap_content"26             android:layout_alignParentRight="true"27             android:layout_centerVertical="true" />28 29     </RelativeLayout>30 31 </LinearLayout>
View Code

expandlistview_child_layout.xml

  1 <?xml version="1.0" encoding="utf-8"?>  2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  3     android:layout_width="match_parent"  4     android:layout_height="match_parent"  5     android:background="#6f737d"  6     android:orientation="vertical" >  7   8     <TextView  9         android:id="@+id/tv_address" 10         android:layout_width="match_parent" 11         android:layout_height="50dp" 12         android:layout_marginLeft="10dp" 13         android:gravity="center_vertical" 14         android:textColor="@android:color/white" /> 15  16     <LinearLayout 17         android:layout_width="match_parent" 18         android:layout_height="wrap_content" 19         android:gravity="center_vertical" 20         21         android:orientation="horizontal" > 22  23         <LinearLayout 24             android:layout_width="fill_parent" 25             android:layout_height="match_parent" 26             android:layout_weight="1" 27             android:gravity="center_vertical" 28             android:orientation="horizontal" 29             android:padding="10dp" > 30  31             <ImageView 32                 android:layout_width="wrap_content" 33                 android:layout_height="wrap_content" 34                 android:src="@drawable/fax_icon" /> 35  36             <TextView 37                 android:id="@+id/tv_fax" 38                 android:layout_width="100dp" 39                 android:layout_height="wrap_content" 40                 android:layout_marginLeft="10dp" 41                 android:textColor="@android:color/white" /> 42         </LinearLayout> 43  44         <LinearLayout 45             android:id="@+id/tel_layout" 46             android:layout_width="fill_parent" 47             android:layout_height="match_parent" 48             android:layout_weight="1" 49             android:background="@drawable/station_tel_selected" 50             android:gravity="center_vertical" 51             android:orientation="horizontal" 52             android:padding="10dp" > 53  54             <ImageView 55                 android:layout_width="wrap_content" 56                 android:layout_height="wrap_content" 57                 android:src=<?xml version="1.0" encoding="utf-8"?> 58 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 59     android:layout_width="match_parent" 60     android:layout_height="match_parent" 61     android:background="#6f737d" 62     android:orientation="vertical" > 63  64     <TextView 65         android:id="@+id/tv_address" 66         android:layout_width="match_parent" 67         android:layout_height="50dp" 68         android:layout_marginLeft="10dp" 69         android:gravity="center_vertical" 70         android:textColor="@android:color/white" /> 71  72     <LinearLayout 73         android:layout_width="match_parent" 74         android:layout_height="wrap_content" 75         android:gravity="center_vertical" 76         77         android:orientation="horizontal" > 78  79         <LinearLayout 80             android:layout_width="fill_parent" 81             android:layout_height="match_parent" 82             android:layout_weight="1" 83             android:gravity="center_vertical" 84             android:orientation="horizontal" 85             android:padding="10dp" > 86  87             <ImageView 88                 android:layout_width="wrap_content" 89                 android:layout_height="wrap_content" 90                 android:src="@drawable/fax_icon" /> 91  92             <TextView 93                 android:id="@+id/tv_fax" 94                 android:layout_width="100dp" 95                 android:layout_height="wrap_content" 96                 android:layout_marginLeft="10dp" 97                 android:textColor="@android:color/white" /> 98         </LinearLayout> 99 100         <LinearLayout101             android:id="@+id/tel_layout"102             android:layout_width="fill_parent"103             android:layout_height="match_parent"104             android:layout_weight="1"105             android:background="@drawable/station_tel_selected"106             android:gravity="center_vertical"107             android:orientation="horizontal"108             android:padding="10dp" >109 110             <ImageView111                 android:layout_width="wrap_content"112                 android:layout_height="wrap_content"113                 android:src="@drawable/tel_icon" />114 115             <TextView116                 android:id="@+id/tv_tel"117                 android:layout_width="100dp"118                 android:layout_height="wrap_content"119                 android:layout_marginLeft="10dp"120                 android:textColor="@android:color/white" />121         </LinearLayout>122     </LinearLayout>123 124     <LinearLayout125         android:layout_width="match_parent"126         android:layout_height="0.5dp"127         android:background="@android:color/black" >128     </LinearLayout>129 130 </LinearLayout>"@drawable/tel_icon" />131 132             <TextView133                 android:id="@+id/tv_tel"134                 android:layout_width="100dp"135                 android:layout_height="wrap_content"136                 android:layout_marginLeft="10dp"137                 android:textColor="@android:color/white" />138         </LinearLayout>139     </LinearLayout>140 141     <LinearLayout142         android:layout_width="match_parent"143         android:layout_height="0.5dp"144         android:background="@android:color/black" >145     </LinearLayout>146 147 </LinearLayout>
View Code

 

 

Android的ExpandableListView的学习