我试图将可扩展列表视图中的每个子代分配给其适当的父代,但最终我将所有子数据分配给列表视图中的每个父代。
这是我的活动:
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;
}
当前状态下的列表视图的屏幕截图:
答案 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;
}
希望有帮助!