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
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 ListgroupArray;//组列表 private List
> 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 (); childArray = new ArrayList
>(); /*-第一季-*/ initdate(); expandableListView_one.setAdapter(new ExpandableListViewaAdapter(ExpandableListViewDemo.this)); /*-第二季-*/// groupArray.add("移动开发");// List arrayList = new ArrayList ();// arrayList.add("Android");// arrayList.add("IOS");// arrayList.add("Windows Phone");// //组循环// for(int index=0;index childItem =new ArrayList (); for(int index=0;index
运行效果:
案例二:
1.定义一个主界面expandablelistview.xml
2.在res/drawable目录下创建样式文件expandablelistview_groups.xml该界面是组界面:
3.在res/drawable目录下创建样式文件expandablelistview_child.xml;是子控件,直接显示列表内容
定义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); //创建二个一级条目标题 Maptitle_1 = new HashMap (); Map title_2 = new HashMap (); title_1.put("group", "移动开发"); title_2.put("group", "男人的需求"); //创建一级条目容器 List
上面的样式也可以使用系统的自带的样式如下:
android.R.layout.simple_expandable_list_item_1,//层显示样式 ,系统自定义
android.R.layout.simple_expandable_list_item_2,
运行效果:
案例三:如果group中有个ImageVIew将会是什么情况呢?
在SimpleExpandableListAdapter中有如下方法:
private void bindView(View view, Mapdata, 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, Mapdata, 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])); } } } }}