效果图
直接上源码
主布局: activity_main
<?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:orientation="vertical" >
<ExpandableListView
android:id="@+id/expandableListView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:groupIndicator="@null" >
</ExpandableListView>
</LinearLayout>
group布局 : activity_expandable_head.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/RelativeLayout1"
android:layout_width="match_parent"
android:layout_height="30dp"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:orientation="vertical" >
<ImageView
android:id="@+id/head_ico"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerInParent="true"
android:src="@drawable/right" />
<TextView
android:id="@+id/head_text"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_centerHorizontal="true"
android:layout_centerInParent="true"
android:text="TextView" />
</RelativeLayout>
child布局 : activity_list_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="25dp"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="30dp"
android:gravity="center"
android:text="TextView" />
</LinearLayout>
MainActivity
package com.test_expandableview.main;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.test_expandableview.R;
public class MainActivity extends Activity implements OnChildClickListener{
private ArrayList<String> groups;
private Map<String,ArrayList> childs;
private LayoutInflater inflater;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ExpandableListView list = (ExpandableListView) findViewById(R.id.expandableListView1);
inflater = LayoutInflater.from(this);
initDatas();
MyExpandableAdapter adapter = new MyExpandableAdapter();
list.setAdapter(adapter);
list.setOnChildClickListener(this);
}
private void initDatas(){
groups = new ArrayList<String>();
childs = new HashMap<String, ArrayList>();
for(int i = 0; i < 10 ; i++){
groups.add("这是第 "+i +" 条");
}
for(int i = 0; i < 10; i++){
String a = groups.get(i);
ArrayList c = new ArrayList<String>();
for(int k = 0; k < 10; k++){
c.add("this is child from group position "+ i +" and childId = "+k);
}
childs.put(a,c);
}
}
private class MyExpandableAdapter extends BaseExpandableListAdapter{
@Override
public int getGroupCount() {
// TODO Auto-generated method stub
return groups.size();
}
@Override
public int getChildrenCount(int groupPosition) {
// TODO Auto-generated method stub
return (childs.get(groups.get(groupPosition)) ).size();
}
@Override
public Object getGroup(int groupPosition) {
// TODO Auto-generated method stub
return groups.get(groupPosition);
}
@Override
public Object getChild(int groupPosition, int childPosition) {
// TODO Auto-generated method stub
return (childs.get(groups.get(groupPosition)) ).get(childPosition);
}
@Override
public long getGroupId(int groupPosition) {
// TODO Auto-generated method stub
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
// TODO Auto-generated method stub
return childPosition;
}
@Override
public boolean hasStableIds() {
// TODO Auto-generated method stub
return false;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded,
View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
HeadItem item;
if(convertView == null){
convertView = inflater.inflate(R.layout.activity_expandable_head, null);
item = new HeadItem();
item.title = (TextView) convertView.findViewById(R.id.head_text);
item.title.setBackgroundColor(Color.GREEN);
item.ico = (ImageView) convertView.findViewById(R.id.head_ico);
convertView.setTag(item);
}
else{
item = (HeadItem) convertView.getTag();
}
item.title.setText(groups.get(groupPosition));
// true : child没有展开
if(isExpanded){
item.ico.setImageResource(R.drawable.buttom);
}
else{
item.ico.setImageResource(R.drawable.right);
}
return convertView;
}
@Override
public View getChildView(int groupPosition, int childPosition,
boolean isLastChild, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
TextView t ;
if(convertView == null){
convertView = inflater.inflate(R.layout.activity_list_item, null);
t = (TextView) convertView.findViewById(R.id.textView1);
convertView.setTag(t);
}
else{
t = (TextView) convertView.getTag();
}
t.setText((String)(childs.get(groups.get(groupPosition)).get(childPosition)) );
return convertView;
}
//设置子view是否可以点击
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
// TODO Auto-generated method stub
return true;
}
class HeadItem{
TextView title;
ImageView ico;
}
}
@Override
public boolean onChildClick(ExpandableListView parent, View v,
int groupPosition, int childPosition, long id) {
// TODO Auto-generated method stub
Log.w("family_log", "click group = "+ groups.get(groupPosition) +" childposition = "+childPosition);
return true;
}
}