2010-07-18 18 views
0

Je souhaite gonfler un composant enfantViewView du composant ExpandableChildView.LinearLayout dans ExpandableListView

code:

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

     View v = convertView; 
     LinearLayout linearOpt = themesOptions.get(childPosition); 

     if(v == null) { 
      v = mInflater.inflate(R.layout.itemrow, null); 
     } 

     LinearLayout ll = (LinearLayout) v.findViewById(R.id.root); 
     ll.addView(linearOpt); 
     return v; 

    } 

Où linearOpt est un vecteur qui contient beaucoup d'objets LinearLayout que j'instancié.

private void prepareThemes(){ 
     View v = mInflater.inflate(R.layout.widget_configure, null); 
     LinearLayout theme = (LinearLayout) v.findViewById(R.id.themeLayout); 
     LinearLayout color = (LinearLayout) v.findViewById(R.id.colorLayout); 
     LinearLayout trans = (LinearLayout) v.findViewById(R.id.transpLayout); 

     themesOptions.add(theme); 
     themesOptions.add(color); 
     themesOptions.add(trans); 

    } 

C'est R.layout.itemrow xml:

Mais j'ai reçu cette erreur:

07-18 10:48:49.740: ERROR/AndroidRuntime(2738): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

Comment puis-je résoudre ce problème?

Répondre

0

Je pense que le problème est dû à la façon dont vous préparez les dispositions dans prepareThemes().

Vous n'avez pas mentionné, mais je suppose que votre 'layout/widget_configure.xml' définit une structure comme celle-ci:?

<LinearLayout android:id="@+id/root"> 
    <LinearLayout android:id="@+id/themeLayout> <!-- ... --> </LinearLayout> 
    <LinearLayout android:id="@+id/colorLayout> <!-- ... --> </LinearLayout> 
    <LinearLayout android:id="@+id/transpLayout> <!-- ... --> </LinearLayout> 
</LinearLayout> 

Ensuite, vous gonflez cela dans prepareThemes() pour obtenir les 3 mises en page sous. Mais à ce moment, ils sont déjà enregistrés en tant qu'enfants de la disposition environnante (que j'ai appelé "root"). Comme l'erreur implique une instance de vue peut être ajouté à un seul parent.

Vous pouvez stocker chaque LinearLayout dans son propre fichier xml, puis le gonfler 3 fois. Ces mises en page stockées peuvent ensuite être ajoutées exactement une fois à un enfant.

Je ne suis pas sûr de ce que vous voulez faire, mais je suppose, ce serait mieux - au lieu de préparer - d'avoir seulement 3 configurations différentes qui incluent la partie de layout.itemrow puis juste faire un switch case dans getChildView() et gonfler la disposition nécessaire à la volée. Parce que même lorsque vous stockez une mise en page non reliée dans prepareThemes: Dès que vous avez plus d'un groupe, vous obtiendrez la même erreur lors de l'ajout d'une mise en page pré-stockée à l'enfant du groupe snd.

J'espère que cela aide.