为每个父级循环ExpandableListview子级

时间:2018-08-10 09:58:35

标签: android expandablelistview android-adapter

我试图将可扩展列表视图中的每个子代分配给其适当的父代,但最终我将所有子数据分配给列表视图中的每个父代。

这是我的活动:

api.USER_VM_LIST(UserId)
    .observeOn(AndroidSchedulers.mainThread())
    .subscribeOn(Schedulers.io())
    .subscribe(new Observer<UserVmList>() {
        @Override
        public void onCompleted() {

        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onNext(UserVmList userVmList) {



        listVmTitle = new ArrayList<>();
        listHashMap = new HashMap<>();
        List<DetailsOfVmObject> detailsOfVmObjects = new ArrayList<>();

        for (int i = 0; i < userVmList.getVm_data().size(); i++) {


            //loop Listview RowTitle
                VmObject vmObject = new VmObject(userVmList.getVm_data().get(i).getHostname(),
                        userVmList.getVm_data().get(i).getStatus(), userVmList.getVm_data().get(i).getImage());
            listVmTitle.add(vmObject);

            //Loop Listview RowChildren
            DetailsOfVmObject details = new DetailsOfVmObject(userVmList.getVm_data().get(i).getFlavor(),
                    userVmList.getVm_data().get(i).getIp_vm());
            detailsOfVmObjects.add(details);

            //loop hashmap
            listHashMap.put(listVmTitle.get(i),detailsOfVmObjects);
        }



            LayoutInflater layoutInflater = getLayoutInflater();
            ViewGroup header = (ViewGroup)layoutInflater.inflate(R.layout.listview_header,expandableListView,false);
            expandableListView.addHeaderView(header);


        ExpandableListAdapter adapter = new ExpandableListAdapter(mContext, listVmTitle,listHashMap,detailsOfVmObjects);
        expandableListView.setAdapter(adapter);

        expandableListView.setOnGroupClickListener((parent, v, groupPosition, id) -> false);

            }
    });
}

这是我的Expandablelistadapter定义:

private Context mContext;
private List<VmObject> listVmTitle;
private HashMap<VmObject, List<DetailsOfVmObject>> listHashMap;
private List<DetailsOfVmObject> detailsOfVmObjects;

public ExpandableListAdapter(Context mContext, List<VmObject> listVmTitle, HashMap<VmObject, List<DetailsOfVmObject>> listHashMap,
                             List<DetailsOfVmObject> detailsOfVmObjects ) {
    this.mContext = mContext;
    this.listVmTitle = listVmTitle;
    this.listHashMap = listHashMap;
    this.detailsOfVmObjects = detailsOfVmObjects;
}

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

@Override
public int getChildrenCount(int groupPosition) {
    return listHashMap.get(listVmTitle.get(groupPosition)).size();
}


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

@Override
public Object getChild(int groupPosition, int childPosition) {
    return listHashMap.get(listVmTitle.get(groupPosition)).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;
}

@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
    final String VmHostName = listVmTitle.get(groupPosition).getHostName();
    final String VmStatus = listVmTitle.get(groupPosition).getStatus();
    final String VmOs = listVmTitle.get(groupPosition).getOs();

    if (convertView == null){
        LayoutInflater layoutInflater = (LayoutInflater)this.mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = layoutInflater.inflate(R.layout.expandable_row,null);
    }

    TextView tvHostname = (TextView) convertView.findViewById(R.id.FirstText1);
    TextView tvStatus = (TextView) convertView.findViewById(R.id.SecondText2);
    TextView tvOs = (TextView) convertView.findViewById(R.id.ThirdText3);

    tvHostname.setText(VmHostName);
    tvStatus.setText(VmStatus);
    tvOs.setText(VmOs);

    return convertView;

}

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

    String Flavor = detailsOfVmObjects.get(childPosition).getFlavor();
    String Ip = detailsOfVmObjects.get(childPosition).getIpAddress();

    if (convertView == null){

        LayoutInflater layoutInflater = (LayoutInflater)this.mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = layoutInflater.inflate(R.layout.expandable_row_children,null);

    }

    TextView TvFlavor = (TextView) convertView.findViewById(R.id.expandable1);
    TextView TvIp = (TextView) convertView.findViewById(R.id.expandable2);

    TvFlavor.setText(Flavor);
    TvIp.setText(Ip);

    return convertView;
}

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

当前状态下的列表视图的屏幕截图:

here's what my expandable listview look like now

1 个答案:

答案 0 :(得分:0)

假设组之间的主机名不同,请尝试如下准备数据列表:

    List<VmObject> listVmTitle = new ArrayList<>();
    HashMap<VmObject, List<DetailsOfVmObject>> listHashMap = new HashMap<>();

    for (int i = 0; i < userVmList.getVm_data().size(); i++) {
        VmObject vmObject = new VmObject(userVmList.getVm_data().get(i).getHostname(),
                userVmList.getVm_data().get(i).getStatus(), userVmList.getVm_data().get(i).getImage());

        List<DetailsOfVmObject> detailsOfVmObjects;
        for (int j = 0; j < listVmTitle.size(); j++) {
            if (listVmTitle.get(j).getHostName().equals(vmObject.getHostName())) { // Group exists
                detailsOfVmObjects = listHashMap.get(vmObject);
            } else { // Group not exists
                listVmTitle.add(vmObject);  // Add new group
                detailsOfVmObjects = new ArrayList<>(); // Create child list for the group
                listHashMap.put(listVmTitle.get(i), detailsOfVmObjects);
            }
            DetailsOfVmObject details = new DetailsOfVmObject(userVmList.getVm_data().get(i).getFlavor(),
                    userVmList.getVm_data().get(i).getIp_vm());
            detailsOfVmObjects.add(details);
        }
    }

请注意,现在只需要两个列表即可创建可扩展列表视图,因此请进行相应的更改。同样在适配器更改中:

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

DetailsOfVmObject childObject = (DetailsOfVmObject)getChild(groupPosition, childPosition);
String Flavor = childObject.getFlavor();
String Ip = childObject.getIpAddress();

if (convertView == null){

    LayoutInflater layoutInflater = (LayoutInflater)this.mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    convertView = layoutInflater.inflate(R.layout.expandable_row_children,null);

}

TextView TvFlavor = (TextView) convertView.findViewById(R.id.expandable1);
TextView TvIp = (TextView) convertView.findViewById(R.id.expandable2);

TvFlavor.setText(Flavor);
TvIp.setText(Ip);

return convertView;
}

希望有帮助!