1

J'ai des données JSON fictives qui ont une ArrayList avec une taille de 8. Elles doivent être remplies dans expandableListView, mais elles ne montrent que le premier groupe. Parce que quand je le débogue, getGroupView est toujours appelé avec le paramètre groupPosition comme zéro.ExpandableListView appelle getGroupView toujours avec le paramètre groupPosition comme 0

Il existe de nombreux exemples de remplissage de ExpandableListViews avec ArrayLists et mon code est presque le même avec eux. Mais je n'ai pas compris pourquoi cela arrive.

Toute aide sera très appréciée

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

EDIT

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

est 'ProgramOnly' est une classe personnalisée par vous? Alors s'il vous plaît poster le code de classe. –

+0

Je pense que Rivu est sur la bonne voie. Dans getGroupView, vous demandez programOnly.size() ce qui m'amène à croire qu'il y a quelque chose là-dedans. – Paul

+0

Il s'agit d'une énorme classe personnalisée qui comprend de nombreuses classes personnalisées par moi aussi. Comme vous pouvez le voir, j'accède à l'objet de classe ProgramSummary, puis j'obtiens le tableau ProgramSetList pour le peupler. Voulez-vous toujours le code de classe? –

Répondre

2

J'ai trouvé la solution. Android n'est pas aussi intelligent que je m'y attendais. Mon ExpandableListView est dans un ScrollView et cela fait sa taille toujours la même chose avec un article. Quel bug!

Je pirater Android en mesurant la hauteur totale à juste après la mise en adaptateur et onGroupExpand et onGroupCollapse

Adaptateur de réglage:

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

Mesure de la hauteur totale:

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, vous avez fait m'a perdu beaucoup de temps. GRRRRRR!