ExpandableListView是一个可展开的列表组件,在这里我就说下他的用法以及一些使用的问题
首先放上程序的效果图,请原谅我不会制作动态图
下来就直接上代码
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_coupon__package);
ViewUtils.inject(this);
//初始化数据
initData();
coupon_package_lv.setAdapter(new CouPon_Package_LV_Adapter(parentList,map,this));
//设置默认打开
for(int i =0;i<parentList.size();i++){
coupon_package_lv.expandGroup(i);
}
}
private void initData() {
//父条目数据
parentList = new ArrayList<>();
parentList.add("红包抵用卷");
parentList.add("加息劵");
parentList.add("折扣卷");
parentList.add("返现卷");
//子条目数据
map = new HashMap<>();
List<String> itemList = new ArrayList<>();
itemList.add("1");
itemList.add("2");
map.put(parentList.get(0),itemList);
List<Integer> itemList1 = new ArrayList<>();
itemList1.add(1);
itemList1.add(2);
map.put(parentList.get(1),itemList1);
}
xml里面的代码
<ExpandableListView
android:id="@+id/coupon_package_lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="8dp"
android:groupIndicator="@null"
android:childDivider="@color/white"
/>
- android:groupIndicator=”@null”去掉ExpandableListView每个条目前面的箭头,为什么要去掉呢是因为我觉得Android默认的不好看想换掉,后面我会讲怎么换掉以及换掉的方法,所以别着急慢慢看下去
- android:childDivider=”@color/white”设置每个字条目分割线
- 在这里我在添加一个就是如果不想要分割线大可以试试小面的属性
android:divider=”@null”我这里设置的分割线为空
adapter中的代码不废话直接上代码
package com.jiun.xiaqi.recode.adapter;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.jiun.xiaqi.recode.R;
import com.jiun.xiaqi.recode.activity.MineCoupons;
import org.w3c.dom.Text;
import java.util.HashMap;
import java.util.List;
/**
* Created by as on 2017/4/18.
*/
public class CouPon_Package_LV_Adapter extends BaseExpandableListAdapter {
private List<String> parentList;
private HashMap<String,List<?extends Object>> map;
private Context context;
public CouPon_Package_LV_Adapter(List<String> parentList, HashMap<String,List<?extends Object>> map, Context context) {
this.parentList = parentList;
this.map = map;
this.context = context;
}
//父条目的个数
@Override
public int getGroupCount() {
return parentList.size();
}
//子条目的个数
@Override
public int getChildrenCount(int groupPosition) {
return map !=null && map.get(parentList.get(groupPosition)) !=null?map.get(parentList.get(groupPosition)).size():0;
}
//父条目
@Override
public Object getGroup(int groupPosition) {
return parentList.size()>0?parentList.get(groupPosition):null;
}
//子条目
@Override
public Object getChild(int groupPosition, int childPosition) {
return map !=null && map.get(parentList.get(groupPosition)) !=null?map.get(parentList.get(groupPosition)).get(childPosition):null;
}
//父条目Id可以直接返回groupPosition
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
//子条目Id可以直接返回groupPosition
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public boolean hasStableIds() {
return true;
}
//父条目布局
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
View inflate = LayoutInflater.from(context).inflate(R.layout.coupon_package_parent_item, parent, false);
View parent_close =inflate.findViewById(R.id.parent_close);
View parent_show =inflate.findViewById(R.id.parent_show);
TextView parent_title = (TextView) inflate.findViewById(R.id.parent_title);
ImageView parent_img = (ImageView) inflate.findViewById(R.id.parent_img);
parent_title.setText(parentList.get(groupPosition));
if(isExpanded){
parent_close.setVisibility(View.GONE);
parent_show.setVisibility(View.VISIBLE);
}else {
parent_close.setVisibility(View.VISIBLE);
parent_show.setVisibility(View.GONE);
}
if(groupPosition ==0){
parent_img.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(context, MineCoupons.class);
context.startActivity(intent);
((Activity)(context)).overridePendingTransition(R.anim.activity_start,0);
}
});
}
return inflate;
}
//子条目布局
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
if(groupPosition==0) {
if(map !=null) {
convertView = LayoutInflater.from(context).inflate(R.layout.coupons_listview_item, parent, false);
}
}else if(groupPosition ==1){
if(map !=null) {
convertView = LayoutInflater.from(context).inflate(R.layout.redpacket_item, parent, false);
}
}
return convertView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
}
上面有注释可以看注释很简单,其实和ListView的Adapter基本相同
然后说下其他东西
第一种方式
还记得android:groupIndicator=”@null”方法吗不记得了没关系在给你贴出使用它的地方
<ExpandableListView
android:id="@+id/coupon_package_lv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="8dp"
android:groupIndicator="@null"
android:childDivider="@color/white"
/>
android:groupIndicator=”@null”这里他的参数是@null没错就是将它的样式设置为空,这句也就是在设置默认的箭头的我们可以给他设置Drawable
我贴出如果需要给他设置的Drawable的布局
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_expanded="true" android:drawable="@drawable/coupon_package_child_close"/>
<item android:state_expanded="false" android:drawable="@drawable/coupon_package_child_show"/>
</selector>
但这样设置是有问题的就是里面的图片会被压缩或者拉伸,设置之后一般不会得到我们想要的效果
第二种方式
.还记得android:groupIndicator=”@null”方法吗不记得了没关系在给你贴出使用它的地方
就是在Adapter里面通过
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent)
方法给他设置布局这里面有一个参数 boolean isExpanded我们可以通过这个参数得到当前列表是展开还是关闭的我们就可以动态的改变图片得到我们想要的样式了
//父条目布局
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
View inflate = LayoutInflater.from(context).inflate(R.layout.coupon_package_parent_item, parent, false);
View parent_close =inflate.findViewById(R.id.parent_close);
View parent_show =inflate.findViewById(R.id.parent_show);
TextView parent_title = (TextView) inflate.findViewById(R.id.parent_title);
ImageView parent_img = (ImageView) inflate.findViewById(R.id.parent_img);
//判断该类表是关闭状态还是打开状态进而动态改变前面的默认图片
if(isExpanded){
parent_close.setVisibility(View.GONE);
parent_show.setVisibility(View.VISIBLE);
}else {
parent_close.setVisibility(View.VISIBLE);
parent_show.setVisibility(View.GONE);
}
}
return inflate;
}
需要注意的是如果使用第二种方式android:groupIndicator=”@null”
属性一定要设置为@null