参考资料:
1,菜鸟教程–ExpandableListView(可折叠列表)的基本使用
2, Android小白–Android中ExpandableListView常用属性总结
效果图
首先是组布局和组子项布局
item_exlist_group.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="5dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="中医院站"
android:textSize="20sp"
android:id="@+id/group_name"
android:textStyle="bold"
android:layout_marginLeft="20dp"
android:textColor="@android:color/black"/>
</LinearLayout>
item_exlist_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="5dp">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/car"
android:layout_marginLeft="40dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1号"
android:textSize="20sp"
android:id="@+id/stationNo"
android:layout_marginLeft="20dp"
android:textColor="@android:color/black"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="("
android:textSize="20sp"
android:layout_marginLeft="20dp"
android:textColor="@android:color/black"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="101"
android:textSize="20sp"
android:id="@+id/peopleNum"
android:textColor="@android:color/black"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="人)"
android:textSize="20sp"
android:textColor="@android:color/black"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="5"
android:textSize="20sp"
android:id="@+id/time"
android:layout_marginLeft="40dp"
android:textColor="@android:color/black"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="分钟到达"
android:textSize="20sp"
android:textColor="@android:color/black"/>
<TextView
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="距离站台"
android:gravity="right"
android:textSize="20sp"
android:textColor="@android:color/black"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="100"
android:id="@+id/distance"
android:textSize="20sp"
android:textColor="@android:color/black"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="米"
android:layout_marginRight="100dp"
android:textSize="20sp"
android:textColor="@android:color/black"/>
</LinearLayout>
TextView有点多,黄色的是变量
然后是activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ExpandableListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/exlist"
android:divider="@drawable/dotted_line"
android:childDivider="@drawable/dotted_line"
android:dividerHeight="5dp"
android:layerType="software"
></ExpandableListView>
<!--android:divider="@drawable/dotted_line" 组之间的分割线-->
<!--android:childDivider="@drawable/dotted_line" 子项之间的分割线-->
<!--android:dividerHeight="5dp" 分割线的高度,若不设置显示不出来-->
<!--android:layerType="software" 4.0以上设备需设置,不然会变成实线-->
</LinearLayout>
界面写完了,写适配器之前先写两个类,Group和 Item ,用于数据的初始化
Group.java
public class Group {
private String group_name;
public Group() {
}
public String getGroup_name() {
return group_name;
}
public void setGroup_name(String group_name) {
this.group_name = group_name;
}
public Group(String group_name) {
this.group_name = group_name;
}
}
Item.java
public class Item {
private String stationNo;
private String peopleNum;
private String time;
private String distance ;
public Item() {
}
public Item(String stationNo, String peopleNum, String time, String distance) {
this.stationNo = stationNo;
this.peopleNum = peopleNum;
this.time = time;
this.distance = distance;
}
public String getStationNo() {
return stationNo;
}
public void setStationNo(String stationNo) {
this.stationNo = stationNo;
}
public String getPeopleNum() {
return peopleNum;
}
public void setPeopleNum(String peopleNum) {
this.peopleNum = peopleNum;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getDistance() {
return distance;
}
public void setDistance(String distance) {
this.distance = distance;
}
}
接下来就是适配器了
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.TextView;
import java.util.ArrayList;
public class MyBaseExpandableListAdapter extends BaseExpandableListAdapter {
private ArrayList<Group> gData;
private ArrayList<ArrayList<Item>> iData;
private Context mContext;
public MyBaseExpandableListAdapter(ArrayList<Group> gData, ArrayList<ArrayList<Item>> iData, Context mContext) {
this.gData = gData;
this.iData = iData;
this.mContext = mContext;
}
@Override
public int getGroupCount() {
return gData.size();
}
@Override
public int getChildrenCount(int i) {
return iData.get(i).size();
}
@Override
public Object getGroup(int i) {
return gData.get(i);
}
@Override
public Object getChild(int i, int i1) {
return iData.get(i).get(i1);
}
@Override
public long getGroupId(int i) {
return i;
}
@Override
public long getChildId(int i, int i1) {
return i1;
}
@Override
public boolean hasStableIds() {
return false;
}
@Override
public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup) {
ViewHolderGroup holderGroup;
if(view == null){
view = LayoutInflater.from(mContext).inflate(R.layout.item_exlist_group, null);
holderGroup = new ViewHolderGroup();
holderGroup.groupName = (TextView) view.findViewById(R.id.group_name);
view.setTag(holderGroup);
}else{
holderGroup = (ViewHolderGroup) view.getTag();
}
holderGroup.groupName.setText(gData.get(i).getGroup_name());
return view;
}
@Override
public View getChildView(int i, int i1, boolean b, View view, ViewGroup viewGroup) {
ViewHolderItem holderItem;
if(view == null){
view = LayoutInflater.from(mContext).inflate(R.layout.item_exlist_item, null);
holderItem = new ViewHolderItem();
holderItem.stationNo = (TextView) view.findViewById(R.id.stationNo);
holderItem.peopleNum = (TextView) view.findViewById(R.id.peopleNum);
holderItem.time = (TextView) view.findViewById(R.id.time);
holderItem.distance = (TextView) view.findViewById(R.id.distance);
view.setTag(holderItem);
}else{
holderItem = (ViewHolderItem) view.getTag();
}
holderItem.stationNo.setText(iData.get(i).get(i1).getStationNo());
holderItem.peopleNum.setText(iData.get(i).get(i1).getPeopleNum());
holderItem.time.setText(iData.get(i).get(i1).getTime());
holderItem.distance .setText(iData.get(i).get(i1).getDistance());
return view;
}
@Override
public boolean isChildSelectable(int i, int i1) {
return true;
}
private class ViewHolderGroup{
private TextView groupName;
}
private class ViewHolderItem{
private TextView stationNo;
private TextView peopleNum;
private TextView time;
private TextView distance ;
}
}
然后MainActivity里面开始加入数据
import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ExpandableListView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private ArrayList<Group>gData = null;
private ArrayList<ArrayList<Item>> iData = null;
private ArrayList<Item> IData = null;
private Context mContext;
private ExpandableListView exlist;
private MyBaseExpandableListAdapter myAdapter = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = MainActivity.this;
exlist = (ExpandableListView) findViewById(R.id.exlist);
gData = new ArrayList<Group>();
iData = new ArrayList<ArrayList<Item>>();
gData.add(new Group("中医院站"));
gData.add(new Group("联想大厦站"));
//中医院站
IData = new ArrayList<Item>();
IData.add(new Item("1","101","5","100"));
IData.add(new Item("2","101","6","1000"));
iData.add(IData);
//联想大厦站
IData = new ArrayList<Item>();
IData.add(new Item("1","101","5","300"));
IData.add(new Item("2","101","7","1200"));
iData.add(IData);
myAdapter = new MyBaseExpandableListAdapter(gData, iData, mContext);
exlist.setAdapter(myAdapter);
//列表默认展开
for(int i = 0; i < myAdapter.getGroupCount(); i++){
exlist.expandGroup(i);
}
}
}
分割线 drawable文件
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="line">
<stroke
android:width="4px"
android:color="#D4D1D1"
android:dashGap="1dp"
android:dashWidth="5dp"/>
</shape>