1

我有一個虛擬的JSON數據,它有一個大小爲8的ArrayList。它們必須填充在expandableListView中,但它只顯示第一組。因爲當我調試它時,getGroupView總是以groupPosition參數調用爲零。ExpandableListView調用getGroupView總是以groupPosition參數作爲0

有很多關於使用ArrayLists填充ExpandableListViews的示例,我的代碼與它們幾乎相同。但我不明白爲什麼會發生這種情況。

任何幫助將非常感激

我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 
} 
} 

編輯

ProgramOnly.class

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 
+1

是'ProgramOnly'是你自定義的類嗎?然後請張貼課程代碼。 –

+0

我認爲Rivu正走在正確的軌道上。在getGroupView中,您要求programOnly.size(),這讓我相信這裏有些東西。 – Paul

+0

這是一個巨大的自定義類,其中也包括我自己的許多自定義類。正如你所看到的,我訪問ProgramSummary類對象,然後獲取ProgramSetList數組來填充它。你還想要課程代碼嗎? –

回答

2

我找到了解決辦法。 Android並不像我想象的那麼聰明。我的ExpandableListViewScrollView中,這使得它的高度始終與一個項目相同。什麼錯誤!

所以我只設置適配器和onGroupExpandonGroupCollapse

設置適配器後,劈的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!

相關問題