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之间的分割线。

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

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

ExpandableListAdapter

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

1.重要方法

    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() {@Overridepublic boolean onChildClick(ExpandableListView parent, View v,int groupPosition, int childPosition, long id) {// TODO Auto-generated method stubtoast("点击了");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]));                                }                                                       }                }        }}

更多相关文章

  1. Android读写文件
  2. Android(安卓)CountDownTimer倒计时器的使用
  3. 怎么在android的XML文件里加入凝视
  4. android 开发-文件存储之读写sdcard
  5. Android(安卓)APK反编译详解(附图)
  6. mybatisplus的坑 insert标签insert into select无参数问题的解决
  7. NPM 和webpack 的基础使用
  8. Python技巧匿名函数、回调函数和高阶函数
  9. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程

随机推荐

  1. Android:读写权限授予后仍提示 Permission
  2. 给 Android(安卓)APP 添加背景图片
  3. Android(安卓)Kotlin 开发--偶遇Rxjava、
  4. React Suspense
  5. React 16.6新API
  6. 如何去理解java中的多态?从jvm角度分析也
  7. android点滴(10) -- Android(安卓)app的
  8. Android(安卓)LCD和键盘 背光亮度数据流
  9. 看一下jvm中那些常用的性能监控工具
  10. ES2017