2010-12-07 41 views
0

J'ai un ExpandableListView avec beaucoup d'enfants. Certains enfants comprennent un titre et une description, tandis que d'autres sont dépourvus de description. J'utilise un SimpleExpandableListAdapter, et la disposition pour les enfants se compose de deux éléments TextView dans un LinearLayout. Le problème que j'ai est que les descriptions vides prennent encore de l'espace, créant trop d'espace entre les éléments qui n'ont pas de descriptions.Comment empêcher les éléments TextView vides de prendre trop de place dans une liste?

Y a-t-il un moyen de masquer le second TextView à la volée dans l'adaptateur ou de configurer la mise en page pour que le TextView vide ne prenne pas de place?

Merci.

Répondre

4

Christian était correct (et s'il avait affiché comme une réponse, j'aurait simplement accepté;)).

La solution était de créer mon propre adaptateur, ce qui s'est avéré plutôt simple, bien qu'il y ait quelques pièges lors de la définition de la visibilité d'un élément. Fondamentalement, vous devez le définir à chaque fois, peu importe si vous le cachez ou si vous le rendez visible. Sinon, vous constaterez que différents éléments de liste afficheront soudainement l'élément caché lorsqu'ils ne le sont pas, ou vice versa, lors du défilement de la liste. Voici quelques exemples de code:

public class SpellListAdapter extends CursorAdapter { 
    private LayoutInflater mLayoutInflater; 
    private Context mContext; 
    public SpellListAdapter(Context context, Cursor c) { 
     super(context, c); 
     mContext = context; 
     mLayoutInflater = LayoutInflater.from(context); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     View v = mLayoutInflater.inflate(R.layout.list_item_fave, parent, false); 
     return v; 
    } 

    @Override 
    public void bindView(View v, Context context, Cursor c) { 
     String spell = c.getString(c.getColumnIndexOrThrow(SpellDbAdapter.KEY_SPELL)); 
     int fave = c.getInt(c.getColumnIndexOrThrow(SpellDbAdapter.KEY_FAVORITE)); 

     TextView Spell = (TextView) v.findViewById(R.id.text); 
     if (Spell != null) { 
      Spell.setText(spell); 
     } 

     //Set Fave Icon 
     TextView Fave = (TextView) v.findViewById(R.id.fave_icon); 
     //here's an important bit. Even though the element is set to invisible by 
     //default in xml, we still have to set it every time. Then, if the 
     //spell is marked as a favorite, set the view to visible. 
     Fave.setVisibility(View.INVISIBLE); 
     if (fave == 1){ 
      Fave.setVisibility(View.VISIBLE); 
     } 
    } 

} 
+1

La raison pour laquelle vous devez le définir à chaque fois est que les vues d'un ListView sont réutilisées. Si vous avez 100 éléments dans votre liste et seulement 10 sont visibles sur l'écran, seulement 10 vues sont créées (= amélioration de la performance). Maintenant que vous faites défiler vers le bas, les vues dont les éléments sont hors de vue sont réutilisées et transmises à bindView pour être remplies avec les éléments qui sont maintenant visibles. – Heinzi

1

Définissez la visibilité à View.GONE

+0

Cela masque toutes les descriptions. Y at-il un moyen de le configurer à la volée dans l'adaptateur? – anakin78z

+1

+1 @anakin Créez votre propre adaptateur. – Cristian

0

Il semble que également mis Fave.setHeight (0) ferait l'affaire dans votre adaptateur.