ExpandableListView 即原生控件折叠列表,很多场景我们都需要使用,先描述一下基本的使用实例:
代码两份:MainActivity+adapter
布局三张:Main+group+child
解释一下各自的作用,MainActivity作为主运行代码和功能逻辑的调用模块,adapter解析ExpandableListView
Main是MainActivity的布局,group是ExpandableListView的第一层布局,child是ExpandableListView的第二层子布局
贴代码:
MainActivity:
package com.hjk.shiny.expandablelistview;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.CheckBox;
import android.widget.ExpandableListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
private static final String GROUP_TEXT="group_text";
private static final String CHILD_TITLE="child_title";
private static final String CHILD_TEXT="child_text";
private static final String CHILD_RADIO="child_radiobutton";
List<Map<String, String>> groupData = new ArrayList<Map<String, String>>();
List<List<Map<String, String>>> childData = new ArrayList<List<Map<String, String>>>();
List<Map<String, Boolean>> groupCheckBox = new ArrayList<Map<String,Boolean>>();
List<List<Map<String, Boolean>>> childCheckBox = new ArrayList<List<Map<String,Boolean>>>();
private ExpandableListView expendableListview;
private String checkedItem="";
private MyAdapter mMyAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
mMyAdapter=new MyAdapter(MainActivity.this,groupData,childData,groupCheckBox,childCheckBox);
expendableListview=(ExpandableListView)findViewById(R.id.test);
expendableListview.setAdapter(mMyAdapter);
//去除系统自带按钮
expendableListview.setGroupIndicator(null);
//去除系统自带分割线
// expendableListview.setDivider(null);
// //展开所有二级列表
// int groupCount=mMyAdapter.getGroupCount();
// for(int i=0;i<groupCount;i++){
// expendableListview.expandGroup(i);
// }
//监听二级列表
expendableListview.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
//关键在于view v参数,可以获取布局下任意控件
CheckBox cbx=(CheckBox)v.findViewById(R.id.multiple_checkbox);
cbx.toggle();
//匹配checkbox勾选取消后在childCheckBox中的数据
if(childCheckBox.get(groupPosition).get(childPosition).get(CHILD_RADIO)){
childCheckBox.get(groupPosition).get(childPosition).put(CHILD_RADIO,false);
}else{
childCheckBox.get(groupPosition).get(childPosition).put(CHILD_RADIO,true);
}
//关于选中项
checkedItem="";//置空
for(int i=0;i<mMyAdapter.getGroupCount();i++){//group
for(int j=0;j<mMyAdapter.getChildrenCount(i);j++){//child
//判断checkbox的true or false
if(childCheckBox.get(i).get(j).get(CHILD_RADIO)){
checkedItem=checkedItem+groupData.get(i).get(GROUP_TEXT)+":"+
childData.get(i).get(j).get(CHILD_TITLE);
}
}
}
Toast.makeText(MainActivity.this,checkedItem,Toast.LENGTH_SHORT).show();
return false;
}
});
}
/**
* 此处需要注意的是childCheckBox的个数一定要多与childData的个数,不然无法匹配
*/
private void initData(){
//group--4 child--3 text item
for(int i=0;i<4;i++){
Map<String,String>curGrpMap=new HashMap<>();//4条
groupData.add(curGrpMap);
curGrpMap.put(GROUP_TEXT,"第"+i+"主条目");
List<Map<String,String>