Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/202.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ExpandableListView始终使用groupPosition参数0调用getGroupView_Android_Arraylist_Expandablelistview_Expandablelistadapter - Fatal编程技术网

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

Android ExpandableListView始终使用groupPosition参数0调用getGroupView,android,arraylist,expandablelistview,expandablelistadapter,Android,Arraylist,Expandablelistview,Expandablelistadapter,我有一个伪JSON数据,它有一个大小为8的ArrayList。必须在expandableListView中填充它们,但它仅显示第一个组。因为当我调试它时,getGroupView总是在groupPosition参数为零的情况下被调用 有很多关于用ArrayList填充ExpandableListView的示例,我的代码与它们几乎相同。但我不明白为什么会这样 任何帮助都将不胜感激 My ExpandableListViewApdater: public class ElvProgramCourse

我有一个伪JSON数据,它有一个大小为8的ArrayList。必须在expandableListView中填充它们,但它仅显示第一个组。因为当我调试它时,getGroupView总是在groupPosition参数为零的情况下被调用

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

任何帮助都将不胜感激

My ExpandableListViewApdater:

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
}
}
编辑

仅限编程类

public class ProgramOnly implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 75459834905648086L;

private String HtmlContent;
private Course currentCourse;
private Program program;
private int videoCount;
private int quizCount;
private int eLearningCount;
private ArrayList<Page> orderedRelatedContent;
private String KALTURA_SESSION_KEY;
private String KALTURA_PREVIEW_SESSION_KEY;
private String videoId;
private boolean isPublicAccess;
private ArrayList<Document> contentDocuments;
private CourseStatusMap courseStatusMap;
private CertificateStatusMap certificateStatus;
private String programAttendeeId;
private String attendeeId;

private int pdfCount;
private int pptCount;
private int htmlCount;
private int audioCount;
private int interval;
private ProgramStatus contentStatus;

private String urlForSocialSharing;

private boolean isContentMustBePurchased;

public Program getProgramSummary() {
    return program;
}

//getter setter stuff
公共类ProgramOnly实现可序列化{
/**
* 
*/
私有静态最终长serialVersionUID=75459834905648086L;
私有字符串HtmlContent;
私人课程;
私人项目;
私人int视频计数;
私人国际quizCount;
私人在线学习计数;
私有ArrayList orderedRelatedContent;
私有字符串KALTURA_会话_密钥;
私有字符串KALTURA_预览_会话_密钥;
私有字符串videoId;
私有布尔isPublicAccess;
私有ArrayList内容文档;
私人课程地图课程地图;
私人CertificateStatusMap certificateStatus;
私有字符串programmadeid;
私有字符串ID;
私人整数pdfCount;
私有整数ppt账户;
私有int htmlCount;
私人int音频计数;
私有整数间隔;
私有程序状态contentStatus;
专用字符串urlForSocialSharing;
私有布尔值IsContent必须购买;
公共程序getProgramSummary(){
返回程序;
}
//吸气剂塞特材料

我找到了解决方案。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);
        }
    }
});
elvProgramCourseList.setOnGroupCollapseListener(新的ExpandableListView.OnGroupCollapseListener(){
@凌驾
公共void-onGroupCollapse(int-groupPosition){
ExpandableListView ExpandableListView=(ExpandableListView)findViewById(R.id.elvProgramCourseList);
ExpandableListAdapter ExpandableListAdapter=expandableListView.getExpandableListAdapter();
if(expandableListAdapter==null){
返回;
}
布尔值ArealGroupsCollapsed=true;
对于(int i=0;i
测量总高度:

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();
}
private void setExpandableListViewHeightBasedOnChildren(ExpandableListView ExpandableListView,Integer expandedGroupPosition){
ExpandableListAdapter ExpandableListAdapter=expandableListView.getExpandableListAdapter();
if(expandableListAdapter==null){
返回;
}
int totalHeight=0;
int totalDividerHeight=0;
对于(int i=0;i对于(int j=0;j我在教程中找到了另一个解决方案:

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);
    }
}

这对我来说很有用!

ProgramOnly
是您自定义的类吗?然后请发布类代码。我认为Rivu的做法是正确的。在getGroupView中,您要求的是ProgramOnly.size()这让我相信里面有一些东西。这是一个巨大的自定义类,包括我自己的许多自定义类。正如你所看到的,我访问ProgramSummary类对象,然后获取ProgramSetList数组来填充它。你还想要类代码吗?