1. 核心代码
//获取一个自定义的带下拉列表的适配器,构造方法传参自己定义,参数不固定
searchAdapter = new EnterpriseExpandableListAdapter(searchEnterpriseList,MainActivity.this,showMeasureItem);
//给控件放入指定的适配器
search_list_view.setAdapter(searchAdapter);
//隐藏箭头图标
search_list_view.setGroupIndicator(null);
//测量项列表的单击事件
search_list_view.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
@Override
public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
//单机产生要执行的代码
return true;
}
});
2. 列表布局文件
<!-- 用于下拉刷新 -->
<android.support.v4.widget.SwipeRefreshLayout
android:id="@+id/main_srl"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<!-- 主listView -->
<ExpandableListView
android:id="@+id/enterprise_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:childDivider="#e4e4e4"
/>
</android.support.v4.widget.SwipeRefreshLayout>
3. 列表填充布局文件
<?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="horizontal"
android:padding="5dp"
android:background="#6BBA79">
<!-- 点击展开的每一行的界面布局,例如qq的分组点开之后的每一个好友的行显示 -->
</LinearLayout>
4. 重写适配器
/**
* Created by hanzh on 2017/12/5.
*/
public class EnterpriseExpandableListAdapter extends BaseExpandableListAdapter {
private ArrayList<String> gData = new ArrayList ();
private ArrayList<ArrayList<String>> iData = new ArrayList<ArrayList<String>> ();
private Context mContext;
private Handler handler;
private Map<String,String> showMeasureItem;
@SuppressLint("HandlerLeak")
public EnterpriseExpandableListAdapter(ArrayList<T> data, Context mContext,Map<String,String> showMeasureItem) {
this.mContext = mContext;
this.showMeasureItem=showMeasureItem;
format(data);
handler = new Handler(){
@Override
public void handleMessage(Message msg) {
notifyDataSetChanged();
super.handleMessage(msg);
}
};
}
//对外暴露的方法,用于更新数据
public void refresh(ArrayList aData , ArrayList<ArrayList<String>> iData){
//传入新的数列表,清空原数据渲染页面,如果数据没变则不更新,数据变了则在底部加载
gData.clear();
iData.clear();
this.gData = gData;
this.iData = iData;
handler.sendMessage(new Message());
}
//返还有多少分组
@Override
public int getGroupCount() {
return gData.size();
}
//返还指定的组有多少行显示
@Override
public int getChildrenCount(int groupPosition) {
return iData.get(groupPosition).size();
}
//返还指定组页面布局中的数据(不是组内的所有行的所有组数据)
@Override
public String getGroup(int groupPosition) {
return gData.get(groupPosition);
}
//返还指定组页面布局中指定行的数据
@Override
public Measure getChild(int groupPosition, int childPosition) {
return iData.get(groupPosition).get(childPosition);
}
//获取指定组的排序id
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public boolean hasStableIds() {
return false;
}
//取得显示给定分组给定子位置的数据用的视图
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
ViewHolderItem itemHolder;
if(convertView == null){
convertView = LayoutInflater.from(mContext).inflate(
R.layout.item_exlist_item, parent, false);
itemHolder = new ViewHolderItem();
itemHolder.img_icon = (ImageView) convertView.findViewById(R.id.img_icon);
itemHolder.tv_name = (TextView) convertView.findViewById(R.id.tv_name);
convertView.setTag(itemHolder);
}else{
itemHolder = (ViewHolderItem) convertView.getTag();
}
itemHolder.img_icon.setImageResource(iData.get(groupPosition).get(childPosition).getiId());
itemHolder.tv_name.setText(iData.get(groupPosition).get(childPosition).getiName());
return convertView;
}
//设置子列表是否可选中
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
private static class ViewHolderGroup{
private TextView tv_group_name;
}
private static class ViewHolderItem{
private ImageView img_icon;
private TextView tv_name;
}
}
//组织下拉子菜单的数据,并显示
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
ViewHolderItem itemHolder;
if(convertView == null){
convertView = LayoutInflater.from(mContext).inflate(
R.layout.check_data_show, parent, false);
itemHolder = new ViewHolderItem();
itemHolder.tv_name = (TextView) convertView.findViewById(R.id.name);
itemHolder.tv_time = (TextView) convertView.findViewById(R.id.time);
itemHolder.tv_data = (TextView) convertView.findViewById(R.id.data);
convertView.setTag(itemHolder);
}else{
itemHolder = (ViewHolderItem) convertView.getTag();
}
/*设置下拉菜单的值
<!--这里执行自己的代码逻辑-->
return convertView;
}
//设置子列表是否可选中
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
private static class ViewHolderGroup{
private TextView enterpriseName;
private ImageView warningImg;
}
private static class ViewHolderItem{
private TextView tv_time;
private TextView tv_data;
private TextView tv_name;
}
public ArrayList<ArrayList<Measure>> getiData() {
return iData;
}
}
//我选择的方式是一个组列表,代表着一个个的组信息,然后通过下标组下标和子列表List对应
组列表是list ,子列表是list这种方式加载界面,如果有更好的方式不必拘泥细节,完成就好