ExpandableListView解析JSON数据
效果图:
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。说明:刚开始使用这个控件我花费了2天的时间,但是一直都没有达到预期的效果,要么就是直接全部不显示,要么就是数据累加了或者点击一级标题两三次才获取到子项数据
步骤:一.布局的安排
1.activity_menumanager.xml(主布局)代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:context=".MenuManager"
android:background="#EDEFF2"
>
<EditText
android:textSize="@dimen/sp_14"
android:layout_margin="@dimen/dp_10"
android:gravity="center"
android:hint="搜索"
android:layout_width="match_parent"
android:layout_height="50dp" />
<ExpandableListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"></ExpandableListView>
</LinearLayout>
2.parent_item.xml(一级标题的布局) 代码:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/parentlist"
android:paddingBottom="8dp"
android:paddingLeft="32dp"
android:paddingTop="8dp"
android:textColor="@android:color/black"
android:textSize="18sp"
android:text="我是大哥大"
/>
</RelativeLayout>
3.child_item.xml(二级目录的布局) 代码:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:id="@+id/childlist"
android:layout_height="wrap_content"
>
<RelativeLayout
android:layout_marginTop="@dimen/dp_10"
android:background="#EDEFF2"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/list_image_search"
android:padding="5dp"
android:layout_margin="10dp"
android:layout_alignParentLeft="true"
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@drawable/dream"
/>
<TextView
android:id="@+id/classify"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/list_image_search"
android:text="系统设置"
android:textColor="#000"
android:textSize="14dp"
android:layout_marginTop="14dp"
/>
<TextView
android:id="@+id/link"
android:layout_marginTop="5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/classify"
android:layout_toRightOf="@+id/list_image_search"
android:text="Basefunction\/index"
/>
<TextView
android:id="@+id/color"
android:padding="15dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="black"
/>
</RelativeLayout>
</LinearLayout>
步骤二,JSON实体类
1.parent_item所对应的JSON实体类 代码:
package com.smartgentechnology.entity;
import java.util.List;
public class ParentExpand {
/**
* info : access
* data : [{"id":"1","pid":"0","name":"系统设置","mca":"Basefunction/index","ico":" icon-cog","color":"black","order_number":"1"},{"id":"15","pid":"0","name":"报表模块","mca":"Ormodule/index","ico":"icon-th-large","color":"","order_number":"2"},{"id":"17","pid":"0","name":"返修模块","mca":"Business/index","ico":"icon-th-large","color":"","order_number":"3"}]
*/
private String info;
private List<DataBean> data;
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public List<DataBean> getData() {
return data;
}
public void setData(List<DataBean> data) {
this.data = data;
}
public static class DataBean {
/**
* id : 1
* pid : 0
* name : 系统设置
* mca : Basefunction/index
* ico : icon-cog
* color : black
* order_number : 1
*/
public DataBean(String name,String id){
this.name=name;
this.id = id;
}
private String id;
private String pid;
private String name;
private String mca;
private String ico;
private String color;
private String order_number;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPid() {
return pid;
}
public void setPid(String pid) {
this.pid = pid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMca() {
return mca;
}
public void setMca(String mca) {
this.mca = mca;
}
public String getIco() {
return ico;
}
public void setIco(String ico) {
this.ico = ico;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getOrder_number() {
return order_number;
}
public void setOrder_number(String order_number) {
this.order_number = order_number;
}
}
}
2.childitem所对应的JSON实体类 代码(parent和child的实体类是一样的,但是child装载的数据是根据parent的id来进行解析的):
package com.smartgentechnology.entity;
import java.util.List;
public class ItemBean {
/**
* info : access
* data : [{"id":"1","pid":"0","name":"系统设置","mca":"Basefunction/index","ico":" icon-cog","color":"black","order_number":"1"},{"id":"15","pid":"0","name":"报表模块","mca":"Ormodule/index","ico":"icon-th-large","color":"","order_number":"2"},{"id":"17","pid":"0","name":"返修模块","mca":"Business/index","ico":"icon-th-large","color":"","order_number":"3"}]
*/
private String info;
private List<DataBean> data;
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public List<DataBean> getData() {
return data;
}
public void setData(List<DataBean> data) {
this.data = data;
}
public static class DataBean {
/**
* id : 1
* pid : 0
* name : 系统设置
* mca : Basefunction/index
* ico : icon-cog
* color : black
* order_number : 1
*/
public DataBean(String name,String mca,String color){
this.name=name;
this.mca =mca;
this.color = color;
}
private String id;
private String pid;
private String name;
private String mca;
private String ico;
private String color;
private String order_number;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPid() {
return pid;
}
public void setPid(String pid) {
this.pid = pid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMca() {
return mca;
}
public void setMca(String mca) {
this.mca = mca;
}
public String getIco() {
return ico;
}
public void setIco(String ico) {
this.ico = ico;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getOrder_number() {
return order_number;
}
public void setOrder_number(String order_number) {
this.order_number = order_number;
}
}
}
步骤三,
menumanager活动的JSON数据解析(parent和child的数据的解析,然后传输给ExpandListViewAdapter进行数据的展示):
package com.smartgentechnology;
import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ExpandableListView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;
import com.google.gson.Gson;
import com.smartgentechnology.adapter.ExpandableAdapter;
import com.smartgentechnology.adapter.ListViewAdapter;
import com.smartgentechnology.entity.ItemBean;
import com.smartgentechnology.entity.ParentExpand;
import com.smartgentechnology.post.GetHttp;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Response;
public class MenuManager extends AppCompatActivity{
private String address = "http://192.168.0.3/index.php/Navjson/dis/";
// private ListView listView;
Context context;
private ExpandableListView expandableListView;
public List<ParentExpand.DataBean> groupString = new ArrayList<>();
Map<Integer,List<ItemBean.DataBean>> childString = new HashMap<>();;
public int count=0;
//public ExpandableAdapter adapter;
// public String[][] childString={{"苹果","香蕉","梨","枣"},
// {"苹果","香蕉","梨","枣"},
// {"苹果","香蕉","梨","枣"},
// {"诸葛亮", "王昭君", "安琪拉", "干将"}};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menumanager);
initDatas();
}
private void initDatas() {
new Thread(new Runnable() {
@Override
public void run() {
GetHttp.getOkHttpRequest(address, "10", "0", "0", new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.i("expanding false", "" + e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String result = response.body().string();
Log.i("wiqu", "f" + result);
parseJsonWith(result);
response.body().close();//关闭网络请求
}
});
}
}).start();
}
private void parseJsonWith(String result) {//解析数据传入界面
ParentExpand parentExpand = new Gson().fromJson(result, ParentExpand.class);
List<ParentExpand.DataBean> dataBeans = parentExpand.getData();
for (ParentExpand.DataBean dataBean : dataBeans) {
ParentExpand.DataBean mData = new ParentExpand.DataBean(dataBean.getName(),dataBean.getId());
int groupid=Integer.parseInt(dataBean.getId());
groupString.add(mData);
Log.i("kukuku",""+groupString);
sendSecond(groupid);
}
inii();
}
private void inii() {
this.runOnUiThread(new Runnable() {
@Override
public void run() {
expandableListView = findViewById(R.id.list);
ExpandableAdapter adapter = new ExpandableAdapter(MenuManager.this,groupString,childString);
expandableListView.setAdapter(adapter);
// listView = findViewById(R.id.listview);
// ListViewAdapter adapter = new ListViewAdapter(MenuManager.this,groupString);
// listView.setAdapter(adapter);
// listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
// @Override
// public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// ParentExpand.DataBean dataBea = groupString.get(position);
// Intent intent = new Intent(MenuManager.this,SecondFool.class);
// intent.putExtra("spacil",dataBea.getId());
// startActivity(intent);
// Log.i("chulaiba"," "+dataBea.getId());
}
});
}
private void sendSecond(final int id) {
GetHttp.getOkHttpRequest(address, "10", "0",String.valueOf(id), new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String responseData = response.body().string();
Log.i("wiqu", "z" + responseData);
parseJson(responseData);
response.body().close();
}
});
}
/*
private void getOkHttpRequest(final String some) {
new Thread(new Runnable() {
@Override
public void run() {
GetHttp.getOkHttpRequest(address, "10", "0",some, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String responseData = response.body().string();
Log.i("wiqu", " " + responseData);
parseJson(responseData);
//
response.body().close();
// childString.clear();//清空数据
}
});
}
}).start();
}
*/
private void parseJson(String responseData) {
ItemBean itemBean = new Gson().fromJson(responseData, ItemBean.class);
List<ItemBean.DataBean> dataBeans = itemBean.getData();
List<ItemBean.DataBean> Data = new ArrayList<>();
for (ItemBean.DataBean dataBean : dataBeans) {
ItemBean.DataBean mData= new ItemBean.DataBean(dataBean.getName(), dataBean.getMca(), dataBean.getColor());
Data.add(mData);
// inii();
}
childString.put(count,Data);
count++;
}
}
2.ExpandableAdapter适配器的编写,继承自BaseExpandableListAdapter,重写他的方法
package com.smartgentechnology.adapter;
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.Button;
import android.widget.TextView;
import com.smartgentechnology.R;
import com.smartgentechnology.entity.ItemBean;
import com.smartgentechnology.entity.ParentExpand;
import java.util.List;
import java.util.Map;
public class ExpandableAdapter extends BaseExpandableListAdapter {
// public String address = "http://192.168.30.89/OR/index.php/Navjson/dis/";
List<ParentExpand.DataBean> groupString;//父级列表数据
// List<ItemBean.DataBean> childString;//子级列表数据,装在子项数据
Map<Integer,List<ItemBean.DataBean>> childString;
Context context;//应用上下文
public ExpandableAdapter(Context context, List<ParentExpand.DataBean> groupString, Map<Integer,List<ItemBean.DataBean>> childString) {
this.context = context;
this.groupString = groupString;
this.childString = childString;
Log.i("shujua",""+groupString+childString);
}
@Override
public int getGroupCount() {//组的个数
Log.i("groupcount"," "+groupString.size());
return groupString.size();
}
/*
* 取得指定分组的子元素数
*/
@Override
public int getChildrenCount(int groupPosition) {
Log.i("fenzu"," "+groupString.size());
return childString.get(groupPosition).size();
}
@Override
public Object getGroup(int groupPosition) {
Log.i("getGruop"," "+groupString.size());
return groupString.get(groupPosition);
}
@Override
public Object getChild(int groupPosition, int childPosition) {
Log.i("mingzia",""+childString.get(groupPosition).get(childPosition).getName());
//我们这里返回一下每个item的名称,以便单击item时显示
return childString.get(groupPosition).get(childPosition).getName();
}
@Override
public long getGroupId(int groupPosition) {
return groupPosition;
}
@Override
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
@Override
public boolean hasStableIds() {
return true;
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
GroupViewHolder groupViewHolder = null;
if(convertView==null){
convertView = LayoutInflater.from(context).inflate(R.layout.parent_item,null);
groupViewHolder = new GroupViewHolder();
groupViewHolder.tvTitle = (TextView) convertView.findViewById(R.id.parentlist);
convertView.setTag(groupViewHolder);
}else{
groupViewHolder = (GroupViewHolder) convertView.getTag();
}
groupViewHolder.tvTitle.setText(groupString.get(groupPosition).getName());
Log.i("didijiuwo",""+groupString.get(groupPosition).getName());
return convertView;
}
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
ChildViewHolder childViewHolder = null;
if(childViewHolder==null){
convertView = LayoutInflater.from(context).inflate(R.layout.childitem,null);
childViewHolder = new ChildViewHolder();
childViewHolder.tvTitle = (TextView) convertView.findViewById(R.id.classify);
childViewHolder.tvContent = (TextView) convertView.findViewById(R.id.link);
childViewHolder.tvColor = (TextView) convertView.findViewById(R.id.color);
convertView.setTag(childViewHolder);
}else{
childViewHolder = (ChildViewHolder) convertView.getTag();
}
// ParentExpand.DataBean itemBean = (ParentExpand.DataBean) getChild(groupPosition,childPosition);
childViewHolder.tvTitle.setText(childString.get(groupPosition).get(childPosition).getName());
childViewHolder.tvContent.setText(childString.get(groupPosition).get(childPosition).getMca());
childViewHolder.tvColor.setText(childString.get(groupPosition).get(childPosition).getColor());
Log.i("qisil"," "+childString.get(groupPosition).get(childPosition).getName());
return convertView;
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
private class GroupViewHolder {
TextView tvTitle;
}
private class ChildViewHolder {
TextView tvTitle;
TextView tvContent;
TextView tvColor;
}
}
完毕!

更多精彩