1.ExpandableListView是可扩展的下拉列表,它的可扩展性在于点击父item可以拉下或收起列表,下面上代码—布局直接用
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.administrator.listviewalllist.MainActivity">
<ExpandableListView
android:layout_marginLeft="10px"
android:layout_marginRight="10px"
android:id="@+id/list_ExpandableListView"
android:layout_width="match_parent"
android:layout_height="match_parent"
></ExpandableListView>
</RelativeLayout>
2.主MainActivity使用
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.Toast;
import com.example.administrator.listviewalllist.Utils.AlertView;
import com.example.administrator.listviewalllist.Utils.OnItemClickListener;
public class MainActivity extends AppCompatActivity implements OnItemClickListener {
private ExpandableListView list_ExpandableListView;
//数据源
public static final String[] BOOKS = {"first", "Second", "Third", "Fourth"};
public static final String[][] FIGURES = {
{"Android", "IOS", "Java", "C++"},
{"Iphone", "三星", "华为", "魅族"},
{"辛辛苦苦敲代码", "开开心心去旅游", "UNIQUE", "KK", "JC"},
{"呵呵", "嘻嘻", "哈哈", "恩恩"},
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
list_ExpandableListView = (ExpandableListView) findViewById(R.id.list_ExpandableListView);
final Adapter adapter = new Adapter(MainActivity.this,BOOKS,FIGURES);
list_ExpandableListView.setAdapter(adapter);
list_ExpandableListView.setGroupIndicator(null);//清除默认的图标
//每次展开一个分组后,关闭其他的分组(接口回调)
adapter.setOnGroupExpandedListener(new onGroupExpandedListener() {
@Override
public void onGroupExpanded(int groupPosition) {
expandonlyOne(list_ExpandableListView, groupPosition, BOOKS.length);
}
});
//分组点击事件
list_ExpandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView parent, View view, int groupPosition, long id) {
boolean groupExpanded = parent.isGroupExpanded(groupPosition);
adapter.setInt(groupPosition, groupExpanded);
// 请务必返回 false,否则分组不会展开
return false;
}
});
//子条目点击事件
list_ExpandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView expandableListView, View view, int i, int i1, long l) {
Toast.makeText(MainActivity.this, "你点击了:" + FIGURES[i][i1], Toast.LENGTH_SHORT).show();
new AlertView(null,null,"取消",null,new String[]{"实时", "回放"},MainActivity.this, AlertView.Style.ActionSheet,MainActivity.this).show();
return true;
}
});
}
private boolean expandonlyOne(ExpandableListView list_expandableListView, int groupPosition, int size) {
boolean result = true;
for (int i = 0; i < size; i++) {
if (i != groupPosition && list_expandableListView.isGroupExpanded(i)) {
result &= list_expandableListView.collapseGroup(i);
}
}
return result;
}
@Override
public void onItemClick(Object o, int position) {
if(position==0){
Toast.makeText(MainActivity.this, "实时", Toast.LENGTH_SHORT).show();
}if(position==1){
Toast.makeText(MainActivity.this, "回放", Toast.LENGTH_SHORT).show();
}
}
}
3.然后需要自己实现一个Adapte类,用于为ExpandableListView提供数据,该类继承了BaseExpandableListAdapter:
import android.content.Context;
import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ImageView;
import android.widget.TextView;
/**
* Created by Administrator on 2017/9/28 0028.
*/
public class Adapter extends BaseExpandableListAdapter {
private Context context;
private String[] groupData;
private String[][] childData;
//用于存放Indicator的集合
private SparseArray<ImageView> mIndicators;
public onGroupExpandedListener mOnGroupExpandedListener;
public Adapter(Context context, String[] groupData, String[][] childData) {
this.context = context;
this.groupData = groupData;
this.childData = childData;
mIndicators = new SparseArray<>();
}
public void setOnGroupExpandedListener(onGroupExpandedListener onGroupExpandedListener) {
mOnGroupExpandedListener = onGroupExpandedListener;
}
//根据分组的展开闭合状态设置指示器
public void setInt(int groupPosition, boolean isExpanded) {
if (isExpanded) {
mIndicators.get(groupPosition).setImageResource(R.drawable.ic_expand_less);
} else {
mIndicators.get(groupPosition).setImageResource(R.drawable.ic_expand_more);
}
}
@Override
public int getGroupCount() {
return groupData.length;
}
@Override
public int getChildrenCount(int i) {
return childData[i].length;
}
@Override
public Object getGroup(int i) {
return groupData[i];
}
@Override
public Object getChild(int i, int i1) {
return childData[i][i1];
}
@Override
public long getGroupId(int i) {
return i;
}
@Override
public long getChildId(int i, int i1) {
return i1;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View view, ViewGroup viewGroup) {
GroupViewHolder groupViewHolder = new GroupViewHolder();
if (view == null) {
view = View.inflate(context, R.layout.item_expand_group_indicator, null);
groupViewHolder.tvTitle = view.findViewById(R.id.label_group_indicator);
groupViewHolder.ivIndicator = view.findViewById(R.id.iv_indicator);
view.setTag(groupViewHolder);
} else {
groupViewHolder = (GroupViewHolder) view.getTag();
}
groupViewHolder.tvTitle.setText(groupData[groupPosition]);
mIndicators.put(groupPosition, groupViewHolder.ivIndicator);
setInt(groupPosition, isExpanded);
return view;
}
@Override
public View getChildView(int i, int i1, boolean b, View view, ViewGroup viewGroup) {
ChildViewHolder childViewHolder = new ChildViewHolder();
if (view == null) {
view = View.inflate(context, R.layout.item_expand_child, null);
childViewHolder.tvTitle = view.findViewById(R.id.label_expand_child);
view.setTag(childViewHolder);
} else {
childViewHolder = (ChildViewHolder) view.getTag();
}
childViewHolder.tvTitle.setText(childData[i][i1]);
return view;
}
@Override
public boolean isChildSelectable(int i, int i1) {
return true;
}
@Override
public void onGroupExpanded(int groupPosition) {
if (mOnGroupExpandedListener != null) {
mOnGroupExpandedListener.onGroupExpanded(groupPosition);
}
}
private static class GroupViewHolder {
TextView tvTitle;
ImageView ivIndicator;
}
private static class ChildViewHolder {
TextView tvTitle;
}
}
4.在适配器里面getGroupView()这个方法用来指定父项显示的样式,内容和行为,其中使用了布局item_expand_group_indicator.xml:如下—
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#888888"
android:orientation="horizontal"
android:padding="8dp">
<TextView
android:id="@+id/label_group_indicator"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:paddingLeft="20dp"
android:textColor="@android:color/white"
android:textSize="20sp"
tools:text="测试数据"/>
<ImageView
android:id="@+id/iv_indicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:src="@drawable/ic_expand_more"
/>
</LinearLayout>
5.在适配器里面getChildView()这个方法用来指定子项显示的样式,内容和行为,其中使用了布局item_expand_child.xml:如下—
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/label_expand_child"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#e3e3e3"
android:gravity="center"
android:paddingBottom="8dp"
android:paddingTop="8dp"
android:textSize="16sp"
tools:text="测试数据" />
6.以上就是ExpandableListView的使用比较简单,下面就来看看效果: