step1:
step2: 3个Java 类
1.AppBean 2.MainActivity 3.MyAdapter
1.
package com.helloworld.expandablelistviewdemo;
import java.util.List;
public class AppBean {
private String name;
public List<ListData> list;
public static class ListData {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<ListData> getList() {
return list;
}
public void setList(List<ListData> list) {
this.list = list;
}
}
2.
package com.helloworld.expandablelistviewdemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ExpandableListView;
import java.util.ArrayList;
import java.util.List;
import static android.R.id.list;
public class MainActivity extends AppCompatActivity {
private ExpandableListView expand_listview;
private MyAdapter adapter;
private List<AppBean> list = new ArrayList<>();
private static final String TAG = "MainActivity";
private List<AppBean.ListData> list1 = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
expand_listview = (ExpandableListView) this.findViewById(R.id.expand_listview);
initView();
}
private void initView() {
//模拟数据
//循环5个父项
for (int i = 0; i < 5; i++) {
AppBean app = new AppBean();
//设置名字 每次加1
app.setName("标签" + i);
//循环5*1个子项
for (int j = 0; j < 1; j++) {
AppBean.ListData app1 = new AppBean.ListData();
//设置名字 每次加1
app1.setName("小明" + i);
//添加到子项的list中
list1.add(app1);
}
//将子项list set进父项中
app.setList(list1);
//添加到父项中
list.add(app);
}
adapter = new MyAdapter(this, list);
expand_listview.setAdapter(adapter);
//父类点击事件是展开对应子类item,并且会自动关闭上一个,这是子类的点击事件
expand_listview.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition,
long id) {
//获取父项名称
Log.e(TAG, "onChildClick: " + list.get(groupPosition).getName());
//获取子项名称
Log.e(TAG, "onChildClick: " + list.get(groupPosition).getList().get(childPosition).getName());
return true;
}
});
}
}
3.
package com.helloworld.expandablelistviewdemo;
import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.List;
public class MyAdapter extends BaseExpandableListAdapter {
private Context context;
private List<AppBean> list;
private LayoutInflater inflater;
public MyAdapter(Context context, List<AppBean> list) {
this.context = context;
this.list = list;
inflater = LayoutInflater.from(context);
}
/**
* 总数据父类的大小
*/
@Override
public int getGroupCount() {
return list.size();
}
/**
* 子类数据大小
*/
@Override
public int getChildrenCount(int groupPosition) {
return list.get(groupPosition).getList().size();
}
/**
* 获得某个父项
*/
@Override
public AppBean getGroup(int groupPosition) {
return list.get(groupPosition);
}
/**
* 获得某个父项的某个子项
*/
@Override
public AppBean.ListData getChild(int groupPosition, int childPosition) {
return list.get(groupPosition).getList().get(childPosition);
}
/**
*获得某个父项的id
*/
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
/**
* 获得某个父项的某个子项的id
*/
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public boolean hasStableIds() {
return false;
}
/**
* 父类View
*/
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
GroupViewHodler groupViewHodler;
if (convertView == null) {
groupViewHodler = new GroupViewHodler();
//父布局
convertView = inflater.inflate(R.layout.list_expandgroup_item, parent, false);
//一级名称
groupViewHodler.group_name = (TextView) convertView.findViewById(R.id.group_name);
//图标(向上或向下箭头)
groupViewHodler.iv_icon = (ImageView) convertView.findViewById(R.id.icon_down_up);
//子类的大小
groupViewHodler.child_size = (TextView) convertView.findViewById(R.id.child_size);
convertView.setTag(groupViewHodler);
} else {
groupViewHodler = (GroupViewHodler) convertView.getTag();
}
//设置记父标题名称
groupViewHodler.group_name.setText(list.get(groupPosition).getName());
//设置子类大小(注意size是int型 加""号)
groupViewHodler.child_size.setText(list.get(groupPosition).getList().size() + "");
//判断是否为点击状态
if (!isExpanded) {
//已点击
groupViewHodler.iv_icon.setImageResource(R.mipmap.icon_pulldown);
} else {
//未点击
groupViewHodler.iv_icon.setImageResource(R.mipmap.icon_pull_up);
}
return convertView;
}
/**
* 子类View
*/
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup
parent) {
ChildViewHodler childViewHodler;
if (convertView == null) {
childViewHodler = new ChildViewHodler();
convertView = inflater.inflate(R.layout.list_expandchild_item, parent, false);
childViewHodler.child_name = (TextView) convertView.findViewById(R.id.child_name);
childViewHodler.recipe_back = (LinearLayout) convertView.findViewById(R.id.recipe_back);
convertView.setTag(childViewHodler);
} else {
childViewHodler = (ChildViewHodler) convertView.getTag();
}
//设置2级名称
childViewHodler.child_name.setText(list.get(groupPosition).getList().get(childPosition).getName());
//设置背景
if (childPosition % 2 == 1) {
childViewHodler.recipe_back.setBackgroundColor(Color.WHITE);
} else {
childViewHodler.recipe_back.setBackgroundColor(Color.parseColor("#f1f1f1"));
}
return convertView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
/**
* 父类ViewHodler
*/
private static class GroupViewHodler {
private ImageView iv_icon;
private TextView group_name, child_size;
}
/**
* 子类ViewHodler
*/
private static class ChildViewHodler {
private TextView child_name;
private LinearLayout recipe_back;
}
}
step3: 3个布局类
1.activity_main.xml
2.list_expandchild_item.xml
3.list_expandgroup_item.xml
1.
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ExpandableListView
android:id="@+id/expand_listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:childDivider="#cbcbcb"
android:dividerHeight="1dp"
android:groupIndicator="@null"/>
</LinearLayout>
2.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/recipe_back"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#fff">
<TextView
android:id="@+id/child_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingRight="10dp"
android:padding="10dp"
android:text="132456"
android:gravity="center"
android:textColor="#333"
android:textSize="14sp"/>
</LinearLayout>
3.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/linear_realnick"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#fff"
android:orientation="horizontal">
<ImageView
android:id="@+id/icon_down_up"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:padding="10dp"
android:src="@mipmap/icon_pulldown"/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="10dp"
android:paddingLeft="5dp"
android:paddingTop="10dp">
<TextView
android:id="@+id/group_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="123"
android:textColor="#333"
android:textSize="16sp"/>
<TextView
android:id="@+id/child_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_marginRight="15dp"
android:text="123"
android:textSize="12sp"/>
</RelativeLayout>
</LinearLayout>