Android ExpandableListView secondary list parent has an interface, and the child implements an interface

The previous article used an interface to implement a two-level list. Due to the large amount of data, returning hundreds of pieces of data at a time would affect performance, so the background divided another function into two interfaces for implementation. After requesting the parent data, click the parent data and then request the child data. It is divided into two interfaces to implement the secondary list.

The interface layout is the same as the previous article, so I won’t post it here anymore. If you need, you can refer to the previous level. Here is just a proxy.



import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;


import org.apache.http.HttpException;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

/**
 * 
 * 
 * Created by admin on 2019/4/12
 */
public class NewCircuitActivity extends BaseActivity  {
    private CartwotypeLayoutBinding newcircuit;
    private CarCircuitAdapter circuitAdapter;

    private String carid, type, is_vip, title_name;
    private String circuit_id;

    private String zx_url;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        newcircuit = DataBindingUtil.setContentView(this, R.layout.cartwotype_layout);

        newcircuit.tvManual.setOnClickListener(this);
        newcircuit.tvMajor.setOnClickListener(this);

        carid = getIntent().getExtras().getString("pinpai");
        type = getIntent().getExtras().getString("type");
        is_vip = getIntent().getExtras().getString("is_vip");
        title_name = getIntent().getExtras().getString("title_name");
        initEven();
        if (carid != null) {
            setTitle(title_name);
            postrequest();
            initCircuitData();
            initBrand();
        }
        circuitAdapter = new CarCircuitAdapter(this);
        newcircuit.reCarType.setAdapter(circuitAdapter);

        //点击父级请求子级数据
        newcircuit.reCarType.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() {
            @Override
            public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {

                circuit_id = circuitAdapter.getGroup(groupPosition).getId();

                if (circuit_id != null && circuitAdapter.getGroup(groupPosition).getSon().size() == 0) {
                    CircuitNextData(groupPosition);
                }
                return false;
            }
        });

        //子级点击
        newcircuit.reCarType.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
            @Override
            public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
                CartypeResponse.DataBean.ListBean.SonBean item = circuitAdapter.getChild(groupPosition, childPosition);
                if (item.getType().equals("1")) {
                    PermissionUtils.getEngine().persissionWith(NewCircuitActivity.this, "3", type, item.getIdflag(), item.getIs_check_sj(), item.getIs_check_sf(), item.getIs_check_zy(), item.getIs_check_vip(), "0");
                } else {
                    PermissionUtils.getEngine().persissionWith(NewCircuitActivity.this, "3", type, item.getIdflag(), item.getIs_check_sj(), item.getIs_check_sf(), item.getIs_check_zy(), item.getIs_check_vip(), "1");
                }
                return false;
            }
        });
    }


    //详情请求参数
    private String postrequest() {
        String data = "";
        try {
            JSONObject ClientKey = new JSONObject();
            ClientKey.put("pinpai", carid);
            ClientKey.put("type", type);
            data = NetInterfaceEngine.getEngine().jsonData(ClientKey);
            Log.e("车型参数是----", data);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return data;
    }


    private void initCircuitData() {
//        showProgressDialog();
        String url = Constant.GETBOOK;
        String json = postrequest();
        NetInterfaceEngine.getEngine().commitOKHttpJson(url, json, new NetHelper() {
            @Override
            public void onSuccess(String result) {
                if (result == null) {
                    Toast.makeText(NewCircuitActivity.this, R.string.net_response, Toast.LENGTH_SHORT).show();
                    return;
                }
                dismissProgressDialog();
                CartypeResponse emty = JSONUtil.parse(result, CartypeResponse.class);
                if (emty.getData() != null && emty.getStatus().equals("ok")) {
                    List<CartypeResponse.DataBean.ListBean> circuit_data = emty.getData().getList();//第一级数据
                    circuitAdapter.addGroupList(circuit_data);

                    if (emty.getData().getList().size() == 0) {
                        newcircuit.ilNodata.lineNodataView.setVisibility(View.VISIBLE);
                        newcircuit.reCarType.setVisibility(View.GONE);
                    }
                } else {
                    if (emty != null && emty.getMessage() != null) {  //添加错误为空判断
                        toast(emty.getMessage());
                    } else {
                        toast("服务器繁忙,请稍候再试");
                    }
                }
            }

            @Override
            public void onFail(HttpException e, String err) {
                Toast.makeText(NewCircuitActivity.this, "网络异常!", Toast.LENGTH_SHORT).show();
                dismissProgressDialog();
            }
        });
    }


    //子级请求参数
    private String nextrequest() {
        String data = "";
        try {
            JSONObject ClientKey = new JSONObject();
            ClientKey.put("chexing", circuit_id);
            ClientKey.put("type", type);
            data = NetInterfaceEngine.getEngine().jsonData(ClientKey);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return data;
    }

    private void CircuitNextData(final int position) {
//        showProgressDialog();
        String url = Constant.CARCIRCUIT;
        String json = nextrequest();
        NetInterfaceEngine.getEngine().commitOKHttpJson(url, json, new NetHelper() {
            @Override
            public void onSuccess(String result) {
                if (result == null) {
                    Toast.makeText(NewCircuitActivity.this, R.string.net_response, Toast.LENGTH_SHORT).show();
                    return;
                }
                dismissProgressDialog();
                CircuitResponse emty = JSONUtil.parse(result, CircuitResponse.class);
                if (emty.getData() != null && emty.getStatus().equals("ok")) {


                    List<CircuitResponse.DataBean.ListBean> circuit_data = emty.getData().getList();//第一级数据
                    if (circuit_data != null && circuit_data.size() > 0) {
                        List<CartypeResponse.DataBean.ListBean.SonBean> mlist = new ArrayList<>();
                        for (int i = 0; i < circuit_data.size(); i++) {
                            CartypeResponse.DataBean.ListBean.SonBean item = new CartypeResponse.DataBean.ListBean.SonBean();

                            item.setType(circuit_data.get(i).getType());
                            item.setBook_name(circuit_data.get(i).getBook_name());
                            item.setPtitle(circuit_data.get(i).getPtitle());
                            item.setTitle(circuit_data.get(i).getTitle());
                            item.setIdflag(circuit_data.get(i).getIdflag());

                            item.setIs_check_vip(circuit_data.get(i).getIs_check_vip());
                            item.setIs_check_sf(circuit_data.get(i).getIs_check_sf());
                            item.setIs_check_sj(circuit_data.get(i).getIs_check_sj());
                            item.setIs_check_zy(circuit_data.get(i).getIs_check_zy());

                            mlist.add(item);
                        }
                        circuitAdapter.addAllChild(position, mlist);
                    }

                    List<CircuitResponse.DataBean.Zldata> zldataList = emty.getData().getZslist();//第二组数据
                    if (zldataList != null && zldataList.size() > 0) {
                        List<CartypeResponse.DataBean.ListBean.SonBean> list = new ArrayList<>();
                        for (int i = 0; i < zldataList.size(); i++) {
                            CartypeResponse.DataBean.ListBean.SonBean item = new CartypeResponse.DataBean.ListBean.SonBean();

                            item.setType(zldataList.get(i).getType());
                            item.setBook_name(zldataList.get(i).getBook_name());
                            item.setPtitle(zldataList.get(i).getPtitle());
                            item.setTitle(zldataList.get(i).getTitle());
                            item.setIdflag(zldataList.get(i).getIdflag());

                            item.setIs_check_vip(zldataList.get(i).getIs_check_vip());
                            item.setIs_check_sf(zldataList.get(i).getIs_check_sf());
                            item.setIs_check_sj(zldataList.get(i).getIs_check_sj());
                            item.setIs_check_zy(zldataList.get(i).getIs_check_zy());

                            list.add(item);
                        }
                        circuitAdapter.addAllChild(position, list);
                    }
                } else {
                    if (emty != null && emty.getMessage() != null) {  //添加错误为空判断
                        toast(emty.getMessage());
                    } else {
                        toast("服务器繁忙,请稍候再试");
                    }
                }
            }

            @Override
            public void onFail(HttpException e, String err) {
                Toast.makeText(NewCircuitActivity.this, "网络异常!", Toast.LENGTH_SHORT).show();
                dismissProgressDialog();
            }
        });
    }


    /**
     * Expandable适配器
     */
    class CarCircuitAdapter extends BaseExpandableListAdapter {
        private Context context;
        private List<CartypeResponse.DataBean.ListBean> group = new ArrayList<>(); //父级


        public CarCircuitAdapter(Context context) {
            this.context = context;

        }

        public void addGroupList(List<CartypeResponse.DataBean.ListBean> mgroup) {
            if (mgroup != null) {

                group.addAll(mgroup);
                for (int i = 0; i < mgroup.size(); i++) {
                    List<CartypeResponse.DataBean.ListBean.SonBean> mchild = new ArrayList<>();
                    group.get(i).setSon(mchild);
                }

            }
            notifyDataSetChanged();
        }

        public void addAllChild(int position, List<CartypeResponse.DataBean.ListBean.SonBean> mchild) {
            group.get(position).getSon().addAll(mchild);
            notifyDataSetChanged();
        }

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

        @Override
        public CartypeResponse.DataBean.ListBean getGroup(int groupPosition) {
            return group.get(groupPosition);
        }

        @Override
        public int getChildrenCount(int groupPosition) {
            return group.get(groupPosition).getSon().size();
        }


        @Override
        public CartypeResponse.DataBean.ListBean.SonBean getChild(int groupPosition, int childPosition) {
            return group.get(groupPosition).getSon().get(childPosition);
        }

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

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

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

        /**
         * 获取显示指定组的视图对象
         *
         * @param groupPosition 组位置
         * @param isExpanded    该组是展开状态还是伸缩状态
         * @param convertView   重用已有的视图对象
         * @param parent        返回的视图对象始终依附于的视图组
         * @return
         * @see android.widget.ExpandableListAdapter#getGroupView(int, boolean,
         * View, ViewGroup)
         */
        @SuppressLint("SetTextI18n")
        @Override
        public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
            ViewHolder holder;
            if (convertView == null) {
                convertView = LayoutInflater.from(context).inflate(R.layout.recycleview_item_parent, null);
                holder = new ViewHolder();
                holder.textView = (TextView) convertView.findViewById(R.id.tv_car_parent_list);
                holder.is_new = convertView.findViewById(R.id.is_new);
                holder.car_up_img = convertView.findViewById(R.id.car_up_img);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            holder.textView.setText("[ " + group.get(groupPosition).getPid_name() + " ]  " + group.get(groupPosition).getKeyword1());
            if (type.equals("18")) {
                if (group.get(groupPosition).getIs_new().equals("1")) {
                    holder.is_new.setVisibility(View.VISIBLE);
                } else {
                    holder.is_new.setVisibility(View.GONE);
                }
            }
            holder.textView.setPadding(10, 10, 0, 10);

            //判断isExpanded就可以控制是按下还是关闭,同时更换图片
            if (isExpanded) {
                holder.car_up_img.setBackgroundResource(R.mipmap.arrow_up);
            } else {
                holder.car_up_img.setBackgroundResource(R.mipmap.arrow_down);
            }

            return convertView;
        }

        /**
         * 获取一个视图对象,显示指定组中的指定子元素数据。
         *
         * @param groupPosition 组位置
         * @param childPosition 子元素位置
         * @param isLastChild   子元素是否处于组中的最后一个
         * @param convertView   重用已有的视图(View)对象
         * @param parent        返回的视图(View)对象始终依附于的视图组
         * @return
         * @see android.widget.ExpandableListAdapter#getChildView(int, int, boolean,
         * View, ViewGroup)
         */
        @SuppressLint("SetTextI18n")
        @Override
        public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
            ViewHolder holder;
            if (convertView == null) {
                convertView = LayoutInflater.from(context).inflate(R.layout.car_circuit_item, null);
                holder = new ViewHolder();
                holder.tv_car_circuit = (TextView) convertView.findViewById(R.id.tv_car_circuit);
                holder.re_cartype_circuit = (RelativeLayout) convertView.findViewById(R.id.re_cartype_circuit);
                holder.tv_sj = (TextView) convertView.findViewById(R.id.tv_sj);
                holder.tv_sf = (TextView) convertView.findViewById(R.id.tv_sf);
                holder.tv_zy = (TextView) convertView.findViewById(R.id.tv_zy);
                holder.tv_vip = (TextView) convertView.findViewById(R.id.tv_vip);
                holder.lin_circuit = convertView.findViewById(R.id.lin_circuit);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            CartypeResponse.DataBean.ListBean.SonBean child = getChild(groupPosition, childPosition);
            if (child.getIs_check_sj().equals("1")) {
                holder.tv_sj.setVisibility(View.VISIBLE);
            } else {
                holder.tv_sj.setVisibility(View.GONE);
            }
            if (child.getIs_check_sf().equals("1")) {
                holder.tv_sf.setVisibility(View.VISIBLE);
            } else {
                holder.tv_sf.setVisibility(View.GONE);
            }
            if (child.getIs_check_zy().equals("1")) {
                holder.tv_zy.setVisibility(View.VISIBLE);
            } else {
                holder.tv_zy.setVisibility(View.GONE);
            }
            if (child.getIs_check_vip().equals("1")) {
                holder.tv_vip.setVisibility(View.VISIBLE);
            } else {
                holder.tv_vip.setVisibility(View.GONE);
            }

            if (child.getType().equals("1") && child.getBook_name() != null && child.getPtitle() != null && child.getTitle() != null) {  //==1,表示资料数据
                holder.tv_car_circuit.setText("[ " + child.getBook_name() + " ]" + " " + child.getPtitle() + "-" + child.getTitle());
            } else {
                holder.tv_car_circuit.setText(child.getTitle());
            }
            holder.tv_car_circuit.setPadding(40, 0, 0, 0);
            holder.lin_circuit.setPadding(40, 0, 0, 0);
            return convertView;
        }

        /**
         * 是否选中指定位置上的子元素。
         * 让isChildSelectable方法返回true,解决ExpandableListView中子元素无法点击,OnChildClickListener无效
         *
         * @param groupPosition
         * @param childPosition
         * @return
         * @see android.widget.ExpandableListAdapter#isChildSelectable(int, int)
         */
        @Override
        public boolean isChildSelectable(int groupPosition, int childPosition) {
            return true;
        }

        class ViewHolder {
            TextView textView, is_new;
            ImageView car_up_img;

            TextView tv_car_circuit;
            TextView tv_sf, tv_zy, tv_vip, tv_sj;
            RelativeLayout re_cartype_circuit;
            LinearLayout lin_circuit;
        }
    }
}

For coding, just refer to the ideas.

Guess you like

Origin blog.csdn.net/qq_19714505/article/details/89356773