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