如何使用retrofit 2在ExpandableListView android中设置子菜单

时间:2018-01-30 07:35:32

标签: java android retrofit2

我想使用改装库从json在ExpandableListView中加载问题和答案。我不知道如何设置子菜单。找到我的解决方案。这是我正在使用的两个模型类。

公共类CatItem {

@SerializedName("stock_division_id")
private String stockDivisionId;

@SerializedName("stock_category_name")
private String stockCategoryName;

@SerializedName("stock_category_id")
private String stockCategoryId;

@SerializedName("stock_category_status")
private String stockCategoryStatus;

@SerializedName("created_date")
private String createdDate;

@SerializedName("updated_date")
private String updatedDate;

public void setStockDivisionId(String stockDivisionId){
    this.stockDivisionId = stockDivisionId;
}

public String getStockDivisionId(){
    return stockDivisionId;
}

public void setStockCategoryName(String stockCategoryName){
    this.stockCategoryName = stockCategoryName;
}

public String getStockCategoryName(){
    return stockCategoryName;
}

public void setStockCategoryId(String stockCategoryId){
    this.stockCategoryId = stockCategoryId;
}

public String getStockCategoryId(){
    return stockCategoryId;
}

public void setStockCategoryStatus(String stockCategoryStatus){
    this.stockCategoryStatus = stockCategoryStatus;
}

public String getStockCategoryStatus(){
    return stockCategoryStatus;
}

public void setCreatedDate(String createdDate){
    this.createdDate = createdDate;
}

public String getCreatedDate(){
    return createdDate;
}

public void setUpdatedDate(String updatedDate){
    this.updatedDate = updatedDate;
}

public String getUpdatedDate(){
    return updatedDate;
}

@Override
public String toString(){
    return 
        "CatItem{" + 
        "stock_division_id = '" + stockDivisionId + '\'' + 
        ",stock_category_name = '" + stockCategoryName + '\'' + 
        ",stock_category_id = '" + stockCategoryId + '\'' + 
        ",stock_category_status = '" + stockCategoryStatus + '\'' + 
        ",created_date = '" + createdDate + '\'' + 
        ",updated_date = '" + updatedDate + '\'' + 
        "}";
    }

}

公共类数据{

@SerializedName("division")
private List<DivisionItem> division;

public void setDivision(List<DivisionItem> division){
    this.division = division;
}

public List<DivisionItem> getDivision(){
    return division;
}

@Override
public String toString(){
    return 
        "Data{" + 
        "division = '" + division + '\'' + 
        "}";
    }

}

public class DivisionItem {

@SerializedName("cat")
private List<CatItem> cat;

@SerializedName("division_name")
private String divisionName;

@SerializedName("division_id")
private String divisionId;

public void setCat(List<CatItem> cat){
    this.cat = cat;
}

public List<CatItem> getCat(){
    return cat;
}

public void setDivisionName(String divisionName){
    this.divisionName = divisionName;
}

public String getDivisionName(){
    return divisionName;
}

public void setDivisionId(String divisionId){
    this.divisionId = divisionId;
}

public String getDivisionId(){
    return divisionId;
}

@Override
public String toString(){
    return 
        "DivisionItem{" + 
        "cat = '" + cat + '\'' + 
        ",division_name = '" + divisionName + '\'' + 
        ",division_id = '" + divisionId + '\'' + 
        "}";
    }

}

模型类getMenuResponse 公共类GetMenuResponse {

@SerializedName("code")
private int code;

@SerializedName("data")
private Data data;

@SerializedName("message")
private String message;

public void setCode(int code){
    this.code = code;
}

public int getCode(){
    return code;
}

public void setData(Data data){
    this.data = data;
}

public Data getData(){
    return data;
}

public void setMessage(String message){
    this.message = message;
}

public String getMessage(){
    return message;
}

@Override
public String toString(){
    return 
        "GetMenuResponse{" + 
        "code = '" + code + '\'' + 
        ",data = '" + data + '\'' + 
        ",message = '" + message + '\'' + 
        "}";
    }

}

适配器类 public class ExpandableListAdapter扩展BaseExpandableListAdapter {

private Context _context;
private List<String> _listDataHeader; // header titles
// child data in format of header title, child title
private HashMap<String, List<String>> _listDataChild;

public ExpandableListAdapter(Context context, List<String> listDataHeader,
                             HashMap<String, List<String>> listChildData) {
    this._context = context;
    this._listDataHeader = listDataHeader;
    this._listDataChild = listChildData;
}

@Override
public Object getChild(int groupPosition, int childPosititon) {
    return this._listDataChild.get(this._listDataHeader.get(groupPosition))
            .get(childPosititon);
}

@Override
public long getChildId(int groupPosition, int childPosition) {
    return childPosition;
}

@Override
public View getChildView(int groupPosition, final int childPosition,
                         boolean isLastChild, View convertView, ViewGroup parent) {

    final String childText = (String) getChild(groupPosition, childPosition);

    if (convertView == null) {
        LayoutInflater infalInflater = (LayoutInflater) this._context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = infalInflater.inflate(R.layout.list_item, null);
    }

    TextView txtListChild = (TextView) convertView
            .findViewById(R.id.lblListItem);

    txtListChild.setText(childText);
    return convertView;
}

@Override
public int getChildrenCount(int groupPosition) {
    return this._listDataChild.get(this._listDataHeader.get(groupPosition)).size();
}

@Override
public Object getGroup(int groupPosition) {
    return this._listDataHeader.get(groupPosition);
}

@Override
public int getGroupCount() {
    return this._listDataHeader.size();
}

@Override
public long getGroupId(int groupPosition) {
    return groupPosition;
}

@Override
public View getGroupView(int groupPosition, boolean isExpanded,
                         View convertView, ViewGroup parent) {
    String headerTitle = (String) getGroup(groupPosition);
    if (convertView == null) {
        LayoutInflater infalInflater = (LayoutInflater) this._context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = infalInflater.inflate(R.layout.list_group, null);
    }

    TextView lblListHeader = (TextView) convertView
            .findViewById(R.id.lblListHeader);
    lblListHeader.setTypeface(null, Typeface.BOLD);
    lblListHeader.setText(headerTitle);

    return convertView;
}

@Override
public boolean hasStableIds() {
    return false;
}

@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
    return true;
}

}

MainActivity获取并尝试在此处设置数据我面临问题

公共类MainActivity扩展了AppCompatActivity {

ExpandableListAdapter listAdapter;
ExpandableListView expListView;
List<String> listDataHeader;
HashMap<String, List<String>> listDataChild;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);

    expListView = (ExpandableListView) findViewById(R.id.lvExp);

    ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
    Call<GetMenuResponse> menuDetails = apiService.getMenuDetails();
    menuDetails.enqueue(new Callback<GetMenuResponse>() {
        @Override
        public void onResponse(Call<GetMenuResponse> call, Response<GetMenuResponse> response) {
            Data menuData = response.body().getData();
            int menuSize = menuData.getDivision().size();

            listDataHeader = new ArrayList<String>();
            for (int i = 0; i < menuSize; i++) {
                String divisionName = menuData.getDivision().get(i).getDivisionName();
                listDataHeader.add(divisionName);

                int subMenuSize = menuData.getDivision().get(i).getCat().size();
                for (int j = 0; j < subMenuSize; j++) {
                    int submenusize = menuData.getDivision().get(i).getCat().size();

                    List<String> subMenu = new ArrayList<String>();
                    for (int k = 0; i < submenusize; k++) {
                        String stockCategoryName1 = menuData.getDivision().get(i).getCat().get(j).getStockCategoryName();
                        subMenu.add(stockCategoryName1);
                        listDataChild.put(divisionName, subMenu);
                    }
                }
            }
            listAdapter = new ExpandableListAdapter(getApplicationContext(), listDataHeader, listDataChild);
            expListView.setAdapter(listAdapter);

            //   listDataChild = new HashMap<String, List<String>>();
        }

        @Override
        public void onFailure(Call<GetMenuResponse> call, Throwable t) {
            Toast.makeText(MainActivity.this, "" + t.getMessage(), Toast.LENGTH_SHORT).show();
        }
    });

}

}

这是错误日志......

error stack
01-30 13:07:40.865 18248-18248/com.projectbox.uploadfile E/AndroidRuntime: FATAL EXCEPTION: main
                                                                           Process: com.projectbox.uploadfile, PID: 18248
                                                                           java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object java.util.HashMap.put(java.lang.Object, java.lang.Object)' on a null object reference
                                                                               at com.projectbox.uploadfile.MainActivity$1.onResponse(MainActivity.java:57)
                                                                               at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:68)
                                                                               at android.os.Handler.handleCallback(Handler.java:751)
                                                                               at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                               at android.os.Looper.loop(Looper.java:154)
                                                                               at android.app.ActivityThread.main(ActivityThread.java:6349)
                                                                               at java.lang.reflect.Method.invoke(Native Method)
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:893)
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:783)

Json的回应是......

Json response

{
    "code": 200,
    "message": "SUCCESS",
    "data": {
        "division": [
            {
                "division_id": "1",
                "division_name": "Men",
                "cat": [
                    {
                        "stock_category_id": "1",
                        "stock_division_id": "1",
                        "stock_category_name": "T-Shirts",
                        "stock_category_status": "1",
                        "created_date": "2018-01-12 12:00:14",
                        "updated_date": "2018-01-12 12:00:14"
                    },
                    {
                        "stock_category_id": "3",
                        "stock_division_id": "1",
                        "stock_category_name": "Jeans",
                        "stock_category_status": "1",
                        "created_date": "2018-01-23 06:43:59",
                        "updated_date": "2018-01-23 06:47:33"
                    }
                ]
            },
            {
                "division_id": "2",
                "division_name": "Women",
                "cat": [
                    {
                        "stock_category_id": "2",
                        "stock_division_id": "2",
                        "stock_category_name": "T-Shirts",
                        "stock_category_status": "1",
                        "created_date": "2018-01-12 12:02:24",
                        "updated_date": "2018-01-12 12:02:24"
                    },
                    {
                        "stock_category_id": "4",
                        "stock_division_id": "2",
                        "stock_category_name": "Jeans",
                        "stock_category_status": "1",
                        "created_date": "2018-01-23 06:47:56",
                        "updated_date": "2018-01-23 06:47:56"
                    },
                    {
                        "stock_category_id": "5",
                        "stock_division_id": "2",
                        "stock_category_name": "Tops & Tunics",
                        "stock_category_status": "1",
                        "created_date": "2018-01-23 06:48:36",
                        "updated_date": "2018-01-23 06:48:36"
                    }
                ]
            },
            {
                "division_id": "3",
                "division_name": "Kids",
                "cat": []
            }
        ]
    }
}

2 个答案:

答案 0 :(得分:0)

从响应获取数组列表并设置适配器

    List<DivisionItem> divisionItems=response.body().getData().getDivisionItem();

    if(divisionItems.size>0)
    {
            listAdapter = new ExpandableListAdapter(MainActivity.this, divisionItems);
            expListView.setAdapter(listAdapter);
    }

替换适配器代码

public class ExpandableListAdapter extends BaseExpandableListAdapter {


FragmentActivity mFragmentActivity;
List<DivisionItem> divisionItems;



public PricingExpandableAdapter(FragmentActivity mFragmentActivity, List<DivisionItem> divisionItems) {
    this.mFragmentActivity = mFragmentActivity;
    this.divisionItems = divisionItems;
}

@Override
public Object getChild(int listPosition, int expandedListPosition) {
    return divisionItems.get(listPosition).getCatItem().get(expandedListPosition);
}

@Override
public long getChildId(int listPosition, int expandedListPosition) {
    return expandedListPosition;
}

@Override
public View getChildView(int listPosition, final int expandedListPosition,
                         boolean isLastChild, View convertView, ViewGroup parent) {


    final String sub_title = divisionItems.get(listPosition).getCatItem().get(expandedListPosition).getStockCategoryName();


    if (convertView == null) {
        LayoutInflater layoutInflater = (LayoutInflater) mFragmentActivity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = layoutInflater.inflate(R.layout.list_item, null);
    }


    return convertView;
}

@Override
public int getChildrenCount(int listPosition) {
    return divisionItems.get(listPosition).getCatItem().size();
}

@Override
public Object getGroup(int listPosition) {
    return divisionItems.get(listPosition);
}

@Override
public int getGroupCount() {
    return divisionItems.size();
}

@Override
public long getGroupId(int listPosition) {
    return listPosition;
}

@Override
public View getGroupView(int listPosition, boolean isExpanded,
                         View convertView, ViewGroup parent) {
     String main_title = divisionItems.get(listPosition).getDivisionName();

    if (convertView == null) {
        LayoutInflater layoutInflater = (LayoutInflater) mFragmentActivity.
                getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = layoutInflater.inflate(R.layout.list_group, null);
    }





    return convertView;
}

@Override
public boolean hasStableIds() {
    return false;
}

@Override
public boolean isChildSelectable(int listPosition, int expandedListPosition) {
    return true;
}

}

答案 1 :(得分:0)

我得到了这个答案吗?

        public void onResponse(Call<GetMenuResponse> call, Response<GetMenuResponse> response) {
            Data menuData = response.body().getData();
            int menuSize = menuData.getDivision().size();

            listDataHeader = new ArrayList<>();
            listDataChild = new HashMap<ExpandedMenuModel, List<String>>();

            for (int i = 0; i < menuSize; i++) {
                String divisionName = menuData.getDivision().get(i).getDivisionName();
                listDataHeader.add(new ExpandedMenuModel(divisionName));

                List<String> listArrayList = new ArrayList<>();

                int subMenuSize = menuData.getDivision().get(i).getCat().size();
                for (int j = 0; j < subMenuSize; j++) {
                    String stockCategoryName1 = menuData.getDivision().get(i).getCat().get(j).getStockCategoryName();
                    listArrayList.add(stockCategoryName1);
                    listDataChild.put(listDataHeader.get(i), listArrayList);
                }
            }

            mMenuAdapter = new ExpandableListAdapter(getApplicationContext(), listDataHeader, listDataChild, expandableList);
            expandableList.setAdapter(mMenuAdapter);

}