Android ExpandableListView详解

jopen 10年前

ExpandableListView是android中可以实现下拉list的一个控件,是一个垂直滚动的心事两个级别列表项手风琴试图,列表项是来自ExpandableListViewaAdapter,组可以单独展开。

重要方法:

expandGroup (int groupPos) ;//在分组列表视图中 展开一组,  setSelectedGroup (int groupPosition) ;//设置选择指定的组。    setSelectedChild (int groupPosition, int childPosition, boolean shouldExpandGroup);//设置选择指定的子项。    getPackedPositionGroup (long packedPosition);//返回所选择的组    getPackedPositionForChild (int groupPosition, int childPosition) ;//返回所选择的子项    getPackedPositionType (long packedPosition);//返回所选择项的类型(Child,Group)    isGroupExpanded (int groupPosition);//判断此组是否展开

 expandableListView.setDivider();这个是设定每个Group之间的分割线。</p>

  expandableListView.setGroupIndicator();这个是设定每个Group之前的那个图标。

  expandableListView.collapseGroup(int group); 将第group组收起

</span></span>

ExpandableListAdapter

一个接口,将基础数据链接到一个ExpandableListView。 此接口的实施将提供访问Child的数据(由组分类),并实例化的Child和Group。

1.重要方法</span></p>

    getChildId (int groupPosition, int childPosition) 获取与在给定组给予孩子相关的数据。

    getChildrenCount (int groupPosition) 返回在指定Group的Child数目。

案例:

首先定义个一个布局文件expandablelistview.xml

 

<?xml version="1.0" encoding="utf-8"?>  <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/expandableListView"          android:layout_width ="fill_parent"          android:layout_height ="wrap_content"             >       </ExpandableListView>  </LinearLayout>

 

 

package com.test;    import java.util.ArrayList;  import java.util.List;    import javax.security.auth.PrivateCredentialPermission;    import android.app.Activity;  import android.os.Bundle;  import android.view.Gravity;  import android.view.View;  import android.view.ViewGroup;  import android.view.Window;  import android.widget.AbsListView;  import android.widget.BaseExpandableListAdapter;  import android.widget.ExpandableListView;  import android.widget.TextView;    public class ExpandableListViewDemo extends Activity {      /** Called when the activity is first created. */      //定义两个List用来控制Group和Child中的String;      private  List<String>  groupArray;//组列表   private  List<List<String>> childArray;//子列表   private  ExpandableListView  expandableListView_one;         @Override      public void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);  //        requestWindowFeature(Window.FEATURE_NO_TITLE);  //设置为无标题            setContentView(R.layout.expandablelistview);          expandableListView_one =(ExpandableListView)findViewById(R.id.expandableListView);          groupArray =new ArrayList<String>();          childArray = new ArrayList<List<String>>();                   /*-第一季-*/          initdate();          expandableListView_one.setAdapter(new ExpandableListViewaAdapter(ExpandableListViewDemo.this));                    /*-第二季-*/  //        groupArray.add("移动开发");  //        List<String> arrayList = new ArrayList<String>();  //        arrayList.add("Android");  //        arrayList.add("IOS");  //        arrayList.add("Windows Phone");  //        //组循环  //        for(int index=0;index<groupArray.size();++index)  //        {  //         childArray.add(arrayList);  //        }  //        expandableListView_one.setAdapter(new ExpandableListViewaAdapter(ExpandableListViewDemo.this));                }      class ExpandableListViewaAdapter extends BaseExpandableListAdapter {       Activity activity;        public  ExpandableListViewaAdapter(Activity a)             {                 activity = a;             }           /*-----------------Child */       @Override       public Object getChild(int groupPosition, int childPosition) {        // TODO Auto-generated method stub        return childArray.get(groupPosition).get(childPosition);       }         @Override       public long getChildId(int groupPosition, int childPosition) {        // TODO Auto-generated method stub        return childPosition;       }         @Override       public View getChildView(int groupPosition, int childPosition,         boolean isLastChild, View convertView, ViewGroup parent) {                String string =childArray.get(groupPosition).get(childPosition);                return getGenericView(string);       }         @Override       public int getChildrenCount(int groupPosition) {        // TODO Auto-generated method stub        return childArray.get(groupPosition).size();       }         /* ----------------------------Group */       @Override       public Object getGroup(int groupPosition) {        // TODO Auto-generated method stub        return getGroup(groupPosition);       }         @Override       public int getGroupCount() {        // TODO Auto-generated method stub        return groupArray.size();       }         @Override       public long getGroupId(int groupPosition) {        // TODO Auto-generated method stub        return groupPosition;       }         @Override       public View getGroupView(int groupPosition, boolean isExpanded,         View convertView, ViewGroup parent) {                     String   string=groupArray.get(groupPosition);             return getGenericView(string);       }         @Override       public boolean hasStableIds() {        // TODO Auto-generated method stub        return false;       }         @Override       public boolean isChildSelectable(int groupPosition, int childPosition)        {        // TODO Auto-generated method stub        return true;       }              private TextView  getGenericView(String string )        {                AbsListView.LayoutParams  layoutParams =new AbsListView.LayoutParams(          ViewGroup.LayoutParams.MATCH_PARENT,          ViewGroup.LayoutParams.WRAP_CONTENT);                                TextView  textView =new TextView(activity);                textView.setLayoutParams(layoutParams);                                textView.setGravity(Gravity.CENTER_VERTICAL |Gravity.LEFT);                                textView.setPadding(40, 0, 0, 0);                textView.setText(string);                return textView;           }      }            private void initdate()       {       addInfo("语言", new String[]{"Oracle","Java","Linux","Jquery"});       addInfo("男人的需求", new String[]{"金钱","事业","权力","女人","房子","车","球"});      }      private void addInfo(String group,String []child) {           groupArray.add(group);              List<String>  childItem =new ArrayList<String>();              for(int index=0;index<child.length;index++)       {        childItem.add(child[index]);       }           childArray.add(childItem);   }  }

运行效果:

注释修改如下代码:

 /*-第一季-*/  //        initdate();  //        expandableListView_one.setAdapter(new ExpandableListViewaAdapter(ExpandableListViewDemo.this));                    /*-第二季-*/          groupArray.add("移动开发");          List<String> arrayList = new ArrayList<String>();          arrayList.add("Android");          arrayList.add("IOS");          arrayList.add("Windows Phone");          //组循环          for(int index=0;index<groupArray.size();++index)          {           childArray.add(arrayList);          }          expandableListView_one.setAdapter(new ExpandableListViewaAdapter(ExpandableListViewDemo.this));

 运行效果:

★★★★★★★★★★★★★★★★★★★★

案例二:

1.定义一个主界面expandablelistview.xml

<?xml version="1.0" encoding="utf-8"?>  <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/expandableListView"          android:layout_width ="fill_parent"          android:layout_height ="wrap_content"             >       </ExpandableListView>  </LinearLayout>

2.在res/drawable目录下创建样式文件expandablelistview_groups.xml该界面是组界面:

<?xml version="1.0" encoding="utf-8"?>  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"      android:layout_width="fill_parent"      android:layout_height="fill_parent"      android:orientation="vertical" >       <TextView           android:id="@+id/textGroup"             android:layout_width="fill_parent"             android:layout_height="fill_parent"             android:paddingLeft="40px"             android:paddingTop="6px"             android:paddingBottom="6px"             android:textSize="15sp"             android:text="No data"         >         </TextView>  </LinearLayout>

3.在res/drawable目录下创建样式文件expandablelistview_child.xml;是子控件,直接显示列表内容

<?xml version="1.0" encoding="utf-8"?>  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"      android:layout_width="fill_parent"      android:layout_height="fill_parent"      android:orientation="vertical" >       <TextView               android:id="@+id/textChild"             android:layout_width="fill_parent"              android:layout_height="fill_parent"              android:paddingLeft="60px"             android:paddingTop="10px"             android:paddingBottom="10px"             android:textSize="20sp"             android:text="No Data" />    </LinearLayout>

定义java文件:ExpandableListViewDemo_two.java

 

package com.test;    import java.util.ArrayList;  import java.util.HashMap;  import java.util.List;  import java.util.Map;    import javax.security.auth.PrivateCredentialPermission;    import com.test.R;  import com.test.ExpandableListViewDemo.ExpandableListViewaAdapter;  import com.test.R.id;  import com.test.R.layout;    import android.app.Activity;  import android.os.Bundle;  import android.view.Gravity;  import android.view.View;  import android.view.ViewGroup;  import android.view.Window;  import android.widget.AbsListView;  import android.widget.BaseExpandableListAdapter;  import android.widget.ExpandableListView;  import android.widget.SimpleExpandableListAdapter;  import android.widget.TextView;    public class ExpandableListViewDemo_two extends Activity {   /** Called when the activity is first created. */      private  ExpandableListView  expandableListView_one;      @Override         public void onCreate(Bundle savedInstanceState)         {             super.onCreate(savedInstanceState);             setContentView(R.layout.expandablelistview);             expandableListView_one =(ExpandableListView)findViewById(R.id.expandableListView);             //创建二个一级条目标题              Map<String, String> title_1 = new HashMap<String, String>();             Map<String, String> title_2 = new HashMap<String, String>();                          title_1.put("group", "移动开发");             title_2.put("group", "男人的需求");                          //创建一级条目容器              List<Map<String, String>> gruops = new ArrayList<Map<String,String>>();                          gruops.add(title_1);             gruops.add(title_2);                          //创建二级条目内容                           //内容一              Map<String, String> content_1 = new HashMap<String, String>();             Map<String, String> content_2 = new HashMap<String, String>();                          content_1.put("child", "ANDROID");             content_2.put("child", "IOS");                          List<Map<String, String>> childs_1 = new ArrayList<Map<String,String>>();             childs_1.add(content_1);             childs_1.add(content_2);                          //内容二              Map<String, String> content_3 = new HashMap<String, String>();             Map<String, String> content_4 = new HashMap<String, String>();            Map<String, String> content_5 = new HashMap<String, String>();                        content_3.put("child", "金钱");             content_4.put("child", "权力");             content_5.put("child", "女人");           List<Map<String, String>> childs_2 = new ArrayList<Map<String,String>>();             childs_2.add(content_3);             childs_2.add(content_4);            childs_2.add(content_5);                        //存放两个内容, 以便显示在列表中              List<List<Map<String, String>>> childs = new ArrayList<List<Map<String,String>>>();             childs.add(childs_1);             childs.add(childs_2);                          //创建ExpandableList的Adapter容器      /**    * 使用SimpleExpandableListAdapter显示ExpandableListView    * 参数1.上下文对象Context    * 参数2.一级条目目录集合    * 参数3.一级条目对应的布局文件 (expandablelistview_groups.xml文件   * 参数4.fromto,就是map中的key,指定要显示的对象    * 参数5.与参数4对应,指定要显示在groups中的id    * 参数6.二级条目目录集合    * 参数7.二级条目对应的布局文件    * 参数9.与参数8对应,指定要显示在childs中的id    /           SimpleExpandableListAdapter adapter = new SimpleExpandableListAdapter(                     this, gruops, R.drawable.expandablelistview_groups, new String[]{"group"}, new int[]{R.id.textGroup},                      childs, R.drawable.expandablelistview_child, new String[]{"child"}, new int[]{R.id.textChild}                     );                          //加入列表              expandableListView_one.setAdapter(adapter);        expandableListView_one.setOnChildClickListener(listener);      }         private OnChildClickListener  listener =new OnChildClickListener() {     @Override    public boolean onChildClick(ExpandableListView parent, View v,      int groupPosition, int childPosition, long id) {     // TODO Auto-generated method stub     toast("点击了");     return false;    }   };   private void toast(String str) {   Toast.makeText(this, str, Toast.LENGTH_LONG).show();    }   }  

 上面的样式也可以使用系统的自带的样式如下:

android.R.layout.simple_expandable_list_item_1,//层显示样式 ,系统自定义  

android.R.layout.simple_expandable_list_item_2,  

运行效果:

案例三:如果group中有个ImageVIew将会是什么情况呢?

在SimpleExpandableListAdapter中有如下方法:

private void bindView(View view, Map<String, ?> data, String[] from, int[] to) {          int len = to.length;            for (int i = 0; i < len; i++) {              TextView v = (TextView)view.findViewById(to[i]);              if (v != null) {                  v.setText((String)data.get(from[i]));              }          }      }

从上面的方法中可以看出 SimpleExpandableListAdapter把所以的View都当成TextView来处理了,而不像SimpleAdapter可以自动判断View的类型,自动绑定,解决版本就是重写bingview回调一下试试:

 

public class MyExpandableListAdapter extends BaseExpandableListAdapter{          private void bindView(View view, Map<String, ?> data, String[] from, int[] to) {                  int len = to.length;                  boolean isBound = false;                  for (int i = 0; i < len; i++) {                     final View v = view.findViewById(to[i]);                   if (v!=null) {                  final Object _data = data.get(from[i]);                  String text = _data == null ? "" : data.toString();                  if (text == null) {                      text = "";                  }                            if (mViewBinder != null) {//如果Binder不为空,使用Binder进行处理                                          isBound = mViewBinder.setViewValue(v, data.get(from[i]), text);                                  }                                  if (!isBound) {//如果Binder跳过,使用原来的方法进行处理                                          TextView _v = (TextView)v;                                          _v.setText((String)data.get(from[i]));                                  }                                                         }                  }          }  }

 

 

 

</span></span></span></span>