ExpandableListView可实现伸缩的下拉列表,上图看(图片效果真不咋的):上源码
三步实现:1)界面添加ExpandableListView。2)给要添加到ExpandableListView的数据赋值。3)实现适配器,为ExpandableListView添加适配器。
看着是不是跟ListView或者GridView一样呢。本来就特别像。
1、属性介绍
id:如果我们给他赋值为@+id/exlv,那会出现什么情况呢?看错误日志:Your content must have a ExpandableListView whose id attitude is 'android.R.id.list'。所以如果只有一个ExpandableListView,则它的id必须为:android:id="@id/android:list"。java文件中获取此控件:getExpandableListView()
android:cacheColorHint="#00000000":可去除拖动view时背景变成黑色的效果。
android:listSelector="#00000000":可去除选中时的黄色底色.
android:drawSelectOnTop="false":用来设置listview上的背景色会不会覆盖内容。false表示不会。
2、适配器介绍:BaseExpandableListAdapter,说说其中的一些方法。
BaseExpandableListAdapter中的方法大都含有group或child,先说说group和child:group指的上图的超市、商城、服务,即下拉列表的父类;child指的是下拉列表。
1)getGroupCount():获取group总数,跟ListView/GroupView一样。getChildCount():注意这并不是获取所有group下child的总数,而是获取任意一个group下的child总数。
2)getGroup()、getChild():获取任意一个group/child的数据。可重写可不重写。若重写getChild(),注意返回的是指定group下的child:
public Object getChild(int groupPosition, int childPosition) {
// TODO 自动生成的方法存根
return childPrice.get(groupPosition).get(childPosition);
}
3)getGroupId()、getChildId():只用返回group和child的id就行了。对child,不用指定group。
public long getChildId(int groupPosition, int childPosition) {
// TODO 自动生成的方法存根
return childPosition;
}
4)hasStableIds():group/child是否有固定id,可不重写。
5)getGroupView()、getChildView():跟ListView/GroupView一样。
6)isChildSelectable():设置指定位置的child是否可点击。
3、数据赋值:被这个耽误了好久。
group的数据赋值很简单跟ListView/GroupView一样,只用声明List<TObject>就行了。因为可把所有的group看做一个ListView。而对child的赋值,必须特别注意:
每个group下的child都可看做是一个List,所以给child数据类型应声明为List<List<TObject>>。
贴一段赋值代码,如果只有一个child增加一个List<TObject>,那只有第一组group有数据。
private void initializeData() {
groupTypes=new ArrayList<String>();
groupTypes.add("超市");
groupTypes.add("商城");
groupTypes.add("服务");
groupIcon=new ArrayList<Bitmap>();
bt=BitmapFactory.decodeResource(getResources(), R.drawable.a1_delete);
groupIcon.add(bt);
groupIcon.add(bt);
groupIcon.add(bt);
childGoodsIcon=new ArrayList<List<Bitmap>>();
List<Bitmap> childGoodsIcon_l=new ArrayList<Bitmap>();
childGoodsIcon_l.add(bt);
childGoodsIcon_l.add(bt);
childGoodsIcon_l.add(bt);
List<Bitmap> childGoodsIcon_m=new ArrayList<Bitmap>();
childGoodsIcon_m.add(bt);
childGoodsIcon_m.add(bt);
childGoodsIcon_m.add(bt);
List<Bitmap> childGoodsIcon_n=new ArrayList<Bitmap>();
childGoodsIcon_n.add(bt);
childGoodsIcon_n.add(bt);
childGoodsIcon_n.add(bt);
childGoodsIcon.add(childGoodsIcon_l);
childGoodsIcon.add(childGoodsIcon_m);
childGoodsIcon.add(childGoodsIcon_n);
childDescip=new ArrayList<List<String>>();
List<String> childDescip_l=new ArrayList<String>();
childDescip_l.add("1");
childDescip_l.add("2");
childDescip_l.add("3");
List<String> childDescip_m=new ArrayList<String>();
childDescip_m.add("4");
childDescip_m.add("5");
childDescip_m.add("6");
List<String> childDescip_n=new ArrayList<String>();
childDescip_n.add("7");
childDescip_n.add("8");
childDescip_n.add("9");
childDescip.add(childDescip_l);
childDescip.add(childDescip_m);
childDescip.add(childDescip_n);
childPrice=new ArrayList<List<String>>();
List<String> childPrice_l=new ArrayList<String>();
childPrice_l.add("10");
childPrice_l.add("11");
childPrice_l.add("12");
List<String> childPrice_m=new ArrayList<String>();
childPrice_m.add("13");
childPrice_m.add("14");
childPrice_m.add("15");
List<String> childPrice_n=new ArrayList<String>();
childPrice_n.add("16");
childPrice_n.add("17");
childPrice_n.add("18");
childPrice.add(childPrice_l);
childPrice.add(childPrice_m);
childPrice.add(childPrice_n);
childNum=new ArrayList<List<String>>();
List<String> childNum_m=new ArrayList<String>();
childNum_m.add("19");
childNum_m.add("20");
childNum_m.add("21");
List<String> childNum_n=new ArrayList<String>();
childNum_n.add("22");
childNum_n.add("23");
childNum_n.add("24");
List<String> childNum_l=new ArrayList<String>();
childNum_l.add("25");
childNum_l.add("26");
childNum_l.add("27");
childNum.add(childNum_l);
childNum.add(childNum_m);
childNum.add(childNum_n);
}
贴点别人写的赋值代码,好屌:
/**
* 初始化组、子列表数据
*/
private void initializeData(){
group = new ArrayList<String>();
child = new ArrayList<List<String>>();
addInfo("Andy",new String[]{"male","138123***","GuangZhou"});
addInfo("Fairy",new String[]{"female","138123***","GuangZhou"});
addInfo("Jerry",new String[]{"male","138123***","ShenZhen"});
addInfo("Tom",new String[]{"female","138123***","ShangHai"});
addInfo("Bill",new String[]{"male","138231***","ZhanJiang"});
}
/**
* 模拟给组、子列表添加数据
* @param g-group
* @param c-child
*/
private void addInfo(String g,String[] c){
group.add(g);
List<String> childitem = new ArrayList<String>();
for(int i=0;i<c.length;i++){
childitem.add(c[i]);
}
child.add(childitem);
}
4、设置点击事件:setOnChildClickListener()
5、更改group显示的箭头方向,其实只是更好背景图片。