ExpandableListView始终使用groupPosition参数调用getGroupView为0

时间:2015-12-17 13:39:38

标签: android arraylist expandablelistview expandablelistadapter

我有一个虚拟JSON数据,它有一个大小为8的ArrayList。它们必须填充在expandableListView中,但它只显示第一个组。因为当我调试它时,始终使用groupPosition参数调用getGroupView为零。

有许多关于使用ArrayLists填充ExpandableListViews的示例,我的代码几乎与它们相同。但我不明白为什么会这样。

非常感谢任何帮助

我的ExpandableListViewApdater:

<String[]>

修改

ProgramOnly.class

public class ElvProgramCourseListAdapter extends BaseExpandableListAdapter {

private Activity activity;
private ProgramOnly programOnly;

public ElvProgramCourseListAdapter(Activity activity, ProgramOnly programOnly) {
    this.activity = activity;
    this.programOnly = programOnly;
}

@Override
public int getGroupCount() {
    return programOnly.getProgramSummary().getProgramSetList().size();
}

@Override
public int getChildrenCount(int groupPosition) {
    NativeProgramSet item = programOnly.getProgramSummary().getProgramSetList().get(groupPosition);
    if (item.getId() != null) {
        return item.getCourseIdList().size();
    } else {
        return 0;
    }
}

@Override
public Object getGroup(int groupPosition) {
    return programOnly.getProgramSummary().getProgramSetList().get(groupPosition);
}

@Override
public Object getChild(int groupPosition, int childPosition) {
    NativeProgramSet item = programOnly.getProgramSummary().getProgramSetList().get(groupPosition);
    if (item.getId() != null) {
        return item.getCourseIdList().get(childPosition);
    } else {
        return null;
    }
}

@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) {

    ImageView imgContentListThumbnail;
    ImageView imgContentListRibbon;
    ImageView imgTLIcon;
    ImageView imgKilitIcon;
    TextView txtContentListTitle;
    TextView txtContentListDescription;
    ImageView imgContentListDetail;

    if (convertView == null) {
        LayoutInflater infalInflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = infalInflater.inflate(R.layout.item_contentlist, parent, false);

        imgContentListThumbnail = (ImageView) convertView.findViewById(R.id.imgContentListThumbnail);
        imgContentListRibbon = (ImageView) convertView.findViewById(R.id.imgContentListRibbon);
        imgTLIcon = (ImageView) convertView.findViewById(R.id.imgTLIcon);
        imgKilitIcon = (ImageView) convertView.findViewById(R.id.imgKilitIcon);
        txtContentListTitle = (TextView) convertView.findViewById(R.id.txtContentListTitle);
        Fonts.setTypeface(Fonts.BOLD, txtContentListTitle, activity.getBaseContext());
        txtContentListDescription = (TextView) convertView.findViewById(R.id.txtContentListDescription);
        imgContentListDetail = (ImageView) convertView.findViewById(R.id.imgContentListDetail);

        convertView.setTag(new ViewHolder(imgContentListThumbnail, imgContentListRibbon, imgTLIcon, imgKilitIcon, txtContentListTitle, txtContentListDescription, imgContentListDetail));
    } else {
        ViewHolder viewHolder = (ViewHolder) convertView.getTag();
        imgContentListThumbnail = viewHolder.imgContentListThumbnail;
        imgContentListRibbon = viewHolder.imgContentListRibbon;
        imgTLIcon = viewHolder.imgTLIcon;
        imgKilitIcon = viewHolder.imgKilitIcon;
        txtContentListTitle = viewHolder.txtContentListTitle;
        txtContentListDescription = viewHolder.txtContentListDescription;
        imgContentListDetail = viewHolder.imgContentListDetail;
    }

    NativeProgramSet nativeProgramSet = (NativeProgramSet) getGroup(groupPosition);

    if(nativeProgramSet.getId() != null) {
        convertView.setBackgroundColor(Color.parseColor("#e5e5e5"));
        imgContentListThumbnail.setVisibility(View.GONE);
        imgContentListRibbon.setVisibility(View.GONE);
        imgTLIcon.setVisibility(View.GONE);
        imgKilitIcon.setVisibility(View.GONE);
        txtContentListDescription.setVisibility(View.GONE);
        if(isExpanded) {
            imgContentListDetail.setImageResource(R.drawable.accordion_close_icon);
        } else {
            imgContentListDetail.setImageResource(R.drawable.accordion_open_icon);
        }

        txtContentListTitle.setText(nativeProgramSet.getName());
    } else {
        convertView.setBackgroundColor(Color.WHITE);
        imgContentListThumbnail.setVisibility(View.VISIBLE);
        txtContentListDescription.setVisibility(View.VISIBLE);
        imgContentListDetail.setImageResource(R.drawable.top_search_filter_button_icon);

        Course course = null;
        for(Course item : programOnly.getProgramSummary().getCourseList()) {
            if(item.getId().equals(nativeProgramSet.getCourseIdList().get(0))) {
                course = item;
                break;
            }
        }

        if(course != null) {
            convertView = fillListItem(course, imgContentListThumbnail, imgContentListRibbon, imgTLIcon, imgKilitIcon, txtContentListTitle, txtContentListDescription, imgContentListDetail, convertView);
        }
    }

    return convertView;
}

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

    ImageView imgContentListThumbnail;
    ImageView imgContentListRibbon;
    ImageView imgTLIcon;
    ImageView imgKilitIcon;
    TextView txtContentListTitle;
    TextView txtContentListDescription;
    ImageView imgContentListDetail;

    if (convertView == null) {
        LayoutInflater infalInflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = infalInflater.inflate(R.layout.item_contentlist, parent, false);

        imgContentListThumbnail = (ImageView) convertView.findViewById(R.id.imgContentListThumbnail);
        imgContentListRibbon = (ImageView) convertView.findViewById(R.id.imgContentListRibbon);
        imgTLIcon = (ImageView) convertView.findViewById(R.id.imgTLIcon);
        imgKilitIcon = (ImageView) convertView.findViewById(R.id.imgKilitIcon);
        txtContentListTitle = (TextView) convertView.findViewById(R.id.txtContentListTitle);
        Fonts.setTypeface(Fonts.BOLD, txtContentListTitle, activity.getBaseContext());
        txtContentListDescription = (TextView) convertView.findViewById(R.id.txtContentListDescription);
        imgContentListDetail = (ImageView) convertView.findViewById(R.id.imgContentListDetail);

        convertView.setTag(new ViewHolder(imgContentListThumbnail, imgContentListRibbon, imgTLIcon, imgKilitIcon, txtContentListTitle, txtContentListDescription, imgContentListDetail));
    } else {
        ViewHolder viewHolder = (ViewHolder) convertView.getTag();
        imgContentListThumbnail = viewHolder.imgContentListThumbnail;
        imgContentListRibbon = viewHolder.imgContentListRibbon;
        imgTLIcon = viewHolder.imgTLIcon;
        imgKilitIcon = viewHolder.imgKilitIcon;
        txtContentListTitle = viewHolder.txtContentListTitle;
        txtContentListDescription = viewHolder.txtContentListDescription;
        imgContentListDetail = viewHolder.imgContentListDetail;
    }

    Long courseId = (Long) getChild(groupPosition, childPosition);

    imgContentListThumbnail.setVisibility(View.VISIBLE);
    txtContentListDescription.setVisibility(View.VISIBLE);
    imgContentListDetail.setImageResource(R.drawable.top_search_filter_button_icon);

    Course course = null;
    for(Course item : programOnly.getProgramSummary().getCourseList()) {
        if(item.getId().equals(courseId)) {
            course = item;
            break;
        }
    }

    if(course != null) {
        convertView = fillListItem(course, imgContentListThumbnail, imgContentListRibbon, imgTLIcon, imgKilitIcon, txtContentListTitle, txtContentListDescription, imgContentListDetail, convertView);
    }

    return convertView;
}

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

private static class ViewHolder {
    public final ImageView imgContentListThumbnail;
    public final ImageView imgContentListRibbon;
    public final ImageView imgTLIcon;
    public final ImageView imgKilitIcon;
    public final TextView txtContentListTitle;
    public final TextView txtContentListDescription;
    public final ImageView imgContentListDetail;

    public ViewHolder(ImageView imgContentListThumbnail, ImageView imgContentListRibbon, ImageView imgTLIcon, ImageView imgKilitIcon, TextView txtContentListTitle, TextView txtContentListDescription, ImageView imgContentListDetail) {
        this.imgContentListThumbnail = imgContentListThumbnail;
        this.imgContentListRibbon = imgContentListRibbon;
        this.imgTLIcon = imgTLIcon;
        this.imgKilitIcon = imgKilitIcon;
        this.txtContentListTitle = txtContentListTitle;
        this.txtContentListDescription = txtContentListDescription;
        this.imgContentListDetail = imgContentListDetail;
    }
}

private View fillListItem(final Course crs, ImageView imgContentListThumbnail, ImageView imgContentListRibbon, ImageView imgTLIcon, ImageView imgKilitIcon, TextView txtContentListTitle, TextView txtContentListDescription, ImageView imgContentListDetail, View convertView) {
   //long stuff
}
}

2 个答案:

答案 0 :(得分:2)

我找到了解决方案。 Android并不像我预期的那么聪明。我的ExpandableListView位于ScrollView中,并且其高度始终与一个项目相同。真是个错误!

所以我通过在设置适配器和onGroupExpand以及onGroupCollapse

之后测量总高度来攻击Android

设置适配器:

ExpandableListView elvProgramCourseList = (ExpandableListView) findViewById(R.id.elvProgramCourseList);
ElvProgramCourseListAdapter adapter = new ElvProgramCourseListAdapter(this, programOnly);
elvProgramCourseList.setGroupIndicator(null);
elvProgramCourseList.setChildIndicator(null);
elvProgramCourseList.setAdapter(adapter);
setExpandableListViewHeightBasedOnChildren(elvProgramCourseList, null);

onGroupExpand

elvProgramCourseList.setOnGroupExpandListener(new ExpandableListView.OnGroupExpandListener() {
    @Override
    public void onGroupExpand(int groupPosition) {
        ExpandableListView elvProgramCourseList = (ExpandableListView) findViewById(R.id.elvProgramCourseList);
        collapseOtherGroups(elvProgramCourseList, groupPosition);
        setExpandableListViewHeightBasedOnChildren(elvProgramCourseList, groupPosition);
    }
});

onGroupCollapse

elvProgramCourseList.setOnGroupCollapseListener(new ExpandableListView.OnGroupCollapseListener() {
    @Override
    public void onGroupCollapse(int groupPosition) {
        ExpandableListView expandableListView = (ExpandableListView) findViewById(R.id.elvProgramCourseList);
        ExpandableListAdapter expandableListAdapter = expandableListView.getExpandableListAdapter();

        if (expandableListAdapter == null) {
            return;
        }

        boolean areAllGroupsCollapsed = true;
        for (int i = 0; i < expandableListAdapter.getGroupCount(); i++) {
            if(expandableListView.isGroupExpanded(i)) {
                areAllGroupsCollapsed = false;
                break;
            }
        }

        if(areAllGroupsCollapsed) {
            setExpandableListViewHeightBasedOnChildren(expandableListView, null);
        }
    }
});

测量总高度:

private void setExpandableListViewHeightBasedOnChildren(ExpandableListView expandableListView, Integer expandedGroupPosition) {
    ExpandableListAdapter expandableListAdapter = expandableListView.getExpandableListAdapter();

    if (expandableListAdapter == null) {
        return;
    }

    int totalHeight = 0;
    int totalDividerHeight = 0;
    for (int i = 0; i < expandableListAdapter.getGroupCount(); i++) {
        View groupItem = expandableListAdapter.getGroupView(i, expandedGroupPosition != null, null, expandableListView);
        totalHeight += Utils.convertDpToPixel(92.42f, this);

        if(expandedGroupPosition != null && expandedGroupPosition.equals(i)) {
            for(int j=0;j<expandableListAdapter.getChildrenCount(i);j++) {
                View childItem = expandableListAdapter.getChildView(i, j, j+1==expandableListAdapter.getChildrenCount(i), null, expandableListView);
                totalHeight += Utils.convertDpToPixel(92.42f, this);
            }
            totalDividerHeight += expandableListView.getDividerHeight() * (expandableListAdapter.getChildrenCount(i)-1);
        }
    }

    totalDividerHeight += expandableListView.getDividerHeight() * (expandableListAdapter.getGroupCount()-1);
    ViewGroup.LayoutParams params = expandableListView.getLayoutParams();
    params.height = totalHeight + totalDividerHeight;
    expandableListView.setLayoutParams(params);
    expandableListView.requestLayout();
}
Android,你确实让我失去了很多时间。 GRRRRRR!

答案 1 :(得分:0)

我在教程中找到了另一个解决方案:

public class SecondLevelExpanableListView extends ExpandableListView {

    public SecondLevelExpanableListView(Context context) {
        super(context);
    }

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(999999, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

这对我有用!