1. 首页创建 MainActivity.jav类。
package com.example.hasee.expandablelistviewdemo;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.Toast;
public class MainActivity2 extends AppCompatActivity {
private String TAG = this.getClass().getSimpleName();
private ExpandableListView expandableListView;
public String[] groupString = {"射手","辅助","坦克","法师"};
public String[][] childString = {
{"孙尚香","后羿","马可波罗","狄仁杰"},
{"孙膑","蔡文姬","鬼谷子","杨玉环"},
{"张飞","廉颇","牛魔","项羽"},
{"诸葛亮","王昭君","安琪拉","干将"}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
expandableListView = (ExpandableListView)findViewById(R.id.expend_list);
final MyExtendableListViewAdapter2 mAdapter = new MyExtendableListViewAdapter2();
mAdapter.setGroupString(groupString);
mAdapter.setChildString(childString);
expandableListView.setAdapter(mAdapter);
//---------------------------------------------------
int count = mAdapter.getGroupCount();
Log.e(TAG,"控制他只能打开一个组----------------- 2 count : " + count);
for(int i = 0;i < count;i++){
expandableListView.expandGroup(i); // TODO 在分组列表视图中展开 全部展开
/*if (i!=groupPosition){
expandableListView.collapseGroup(i); // 在分组列表视图中折叠组
}*//*else {
expandableListView.expandGroup(i); // 在分组列表视图中展开一个组
// expandableListView.setSelectedGroup(groupPosition);//置顶,将选择设置为指定的组
}*/
}
//---------------------------------------------------
//设置分组的监听
expandableListView.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
@Override
public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {
Toast.makeText(getApplicationContext(), groupString[groupPosition], Toast.LENGTH_SHORT).show();
return false; // true: 禁用 展开、折叠功能。 false: 启用 展开、折叠功能。
}
});
//设置子项布局监听
expandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
Toast.makeText(getApplicationContext(), childString[groupPosition][childPosition], Toast.LENGTH_SHORT).show();
return true;
}
});
//控制他只能打开一个组
expandableListView.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
@Override
public void onGroupExpand(int groupPosition) {
Log.e(TAG,"控制他只能打开一个组----------------- 2");
int count = mAdapter.getGroupCount();
Log.e(TAG,"控制他只能打开一个组----------------- 2 count : " + count);
for(int i = 0;i < count;i++){
if (i!=groupPosition){
expandableListView.collapseGroup(i); // 在分组列表视图中折叠组
}/*else {
expandableListView.expandGroup(i); // 在分组列表视图中展开一个组
// expandableListView.setSelectedGroup(groupPosition);//置顶,将选择设置为指定的组
}*/
}
mAdapter.notifyDataSetChanged();
}
});
}
}
2. 再创建
MyExtendableListViewAdapter2.java
package com.example.hasee.expandablelistviewdemo;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.TextView;
public class MyExtendableListViewAdapter2 extends BaseExpandableListAdapter {
private String TAG = this.getClass().getSimpleName();
private Context mcontext;
public String[] groupString = {};
public String[][] childString = {};
/*public String[] groupString = {"射手", "辅助", "坦克", "法师"};
public String[][] childString = {
{"孙尚香", "后羿", "马可波罗", "狄仁杰"},
{"孙膑", "蔡文姬", "鬼谷子", "杨玉环"},
{"张飞", "廉颇", "牛魔", "项羽"},
{"诸葛亮", "王昭君", "安琪拉", "干将"}
};*/
@Override
// 获取分组的个数 rhjadd 20190312
public int getGroupCount() {
Log.e(TAG,"getGroupString() -------- getGroupString().length: " + getGroupString().length);
return getGroupString().length;
}
/*@Override
// 获取分组的个数
public int getGroupCount() {
return groupString.length;
}*/
//获取指定分组中的子选项的个数
@Override
public int getChildrenCount(int groupPosition) {
return childString[groupPosition].length;
}
// 获取指定的分组数据
@Override
public Object getGroup(int groupPosition) {
return groupString[groupPosition];
}
//获取指定分组中的指定子选项数据
@Override
public Object getChild(int groupPosition, int childPosition) {
return childString[groupPosition][childPosition];
}
//获取指定分组的ID, 这个ID必须是唯一的
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
//获取子选项的ID, 这个ID必须是唯一的
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
//分组和子选项是否持有稳定的ID, 就是说底层数据的改变会不会影响到它们
@Override
public boolean hasStableIds() {
return true;
}
/**
*
* 获取显示指定组的视图对象
*
* @param groupPosition 组位置
* @param isExpanded 该组是展开状态还是伸缩状态
* @param convertView 重用已有的视图对象
* @param parent 返回的视图对象始终依附于的视图组
*/
// 获取显示指定分组的视图
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
GroupViewHolder groupViewHolder;
if (convertView == null){
convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.partent_item,parent,false);
groupViewHolder = new GroupViewHolder();
groupViewHolder.tvTitle = (TextView)convertView.findViewById(R.id.label_group_normal);
convertView.setTag(groupViewHolder);
}else {
groupViewHolder = (GroupViewHolder)convertView.getTag();
}
groupViewHolder.tvTitle.setText(groupString[groupPosition]);
return convertView;
}
/**
*
* 获取一个视图对象,显示指定组中的指定子元素数据。
*
* @param groupPosition 组位置
* @param childPosition 子元素位置
* @param isLastChild 子元素是否处于组中的最后一个
* @param convertView 重用已有的视图(View)对象
* @param parent 返回的视图(View)对象始终依附于的视图组
* @return
* @see android.widget.ExpandableListAdapter#getChildView(int, int, boolean, android.view.View,
* android.view.ViewGroup)
*/
//取得显示给定分组给定子位置的数据用的视图
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
ChildViewHolder childViewHolder;
if (convertView==null){
convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.child_item,parent,false);
childViewHolder = new ChildViewHolder();
childViewHolder.tvTitle = (TextView)convertView.findViewById(R.id.expand_child);
convertView.setTag(childViewHolder);
}else {
childViewHolder = (ChildViewHolder) convertView.getTag();
}
childViewHolder.tvTitle.setText(childString[groupPosition][childPosition]);
return convertView;
}
//指定位置上的子元素是否可选中
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
static class GroupViewHolder {
TextView tvTitle;
}
static class ChildViewHolder {
TextView tvTitle;
}
public String[] getGroupString() {
Log.e(TAG,"getGroupString() -------- groupString.length: " + groupString.length);
return groupString;
}
public void setGroupString(String[] groupString) {
Log.e(TAG,"setGroupString() -------- groupString.length: " + groupString.length);
this.groupString = groupString;
}
public String[][] getChildString() {
Log.e(TAG,"getChildString() -------- childString.length: " + childString.length);
return childString;
}
public void setChildString(String[][] childString) {
Log.e(TAG,"setChildString() -------- childString.length: " + childString.length);
this.childString = childString;
}
}
3. 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=".MainActivity2">
<ExpandableListView
android:id="@+id/expend_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layoutDirection="rtl"></ExpandableListView>
</LinearLayout>
4.AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.hasee.expandablelistviewdemo">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity2">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
5. child_item.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/expand_child"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="16sp"
android:paddingTop="8dp"
android:paddingBottom="8dp"
tools:text="测试数据"/>
6.partent_item.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/label_group_normal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/holo_blue_light"
android:gravity="left"
android:paddingBottom="8dp"
android:paddingLeft="32dp"
android:paddingTop="8dp"
android:textColor="@android:color/white"
android:textSize="20sp"
tools:text="测试数据"
android:layoutDirection="ltr"/>
所有资料完成。
通过设置属性,可实现只显示一个Group的子菜单 , 显示全部Group的子菜单 。需要自己设置就可以了。
也可以直接下载DEmo:
https://download.csdn.net/download/renhaijuniryfe/11013490
看效果图。
也可以直接下载DEmo: