2 votes

Remplissage d'un seul ListView avec différentes dispositions de lignes

J'essaie d'alimenter une ListView avec une colonne provenant d'une base de données. J'y parviens, mais le problème est que je voudrais utiliser une ressource de mise en page différente selon que l'identifiant correspond à un PendingIntent.

Il s'agit de vérifier si une alarme existe avec le rowid, et je prévois d'avoir un retour visuel dans le listview pour montrer à l'utilisateur quelles alarmes existent. Je peux vérifier avec succès le rowid par rapport à PendingIntents et obtenir un retour booléen.

Le problème auquel je suis confronté est de remplir la ListView avec des ressources de mise en page différentes pour les différentes lignes (est-ce même possible ?) et je n'ai aucune idée de la marche à suivre.

J'ai actuellement le code suivant :

for(int x = 0; x < numNotes; x++)   {

            if(existAlarm(intarray[x])){
                String[] from = new String[] { TodoDbAdapter.KEY_SUMMARY };
                int[] to = new int[] { R.id.label1};
                cursor = dbHelper.fetchTodo(intarray[x]);

                SimpleCursorAdapter notes = new SimpleCursorAdapter(this,
                        R.layout.todo_row_green, cursor, from, to);
                setListAdapter(notes); 

            } else if (!existAlarm(intarray[x])){

                String[] from = new String[] { TodoDbAdapter.KEY_SUMMARY };
                int[] to = new int[] { R.id.label};
                cursor = dbHelper.fetchTodo(intarray[x]);

                SimpleCursorAdapter notes = new SimpleCursorAdapter(this,
                        R.layout.todo_row, cursor, from, to);
                setListAdapter(notes); 
            }   

        }

Mais le ListView ne montre que la dernière entrée de la base de données de la boucle.

Je vous serais très reconnaissant de me donner des conseils, merci.

3voto

codinguser Points 3979

Bien entendu, seul le dernier élément sera affiché. Cela est dû au fait que vous changez l'adaptateur de liste chaque fois que vous entrez dans la boucle et que vous exécutez. Débarrassez-vous de la boucle.

Si je comprends bien, vous voulez afficher une ligne verte ou non en fonction de la tâche à accomplir. Dans ce cas, écrivez votre propre adaptateur de liste qui est une sous-classe de SimpleCursorAdapter. Ensuite, remplacez la fonction newView (Context context, Cursor cursor, ViewGroup parent) pour choisir la vue à utiliser pour afficher la ligne. Le site cursor est déjà déplacé à la bonne position, de sorte que vous pouvez récupérer les valeurs de la BD pour toutes les comparaisons nécessaires.

Par exemple : Je suppose (en raison de la fonction fetchTodo(intarray[x])) que vous effectuez une comparaison sur la base de l'identifiant de la tâche. Dans ce cas, votre code pourrait ressembler à ceci

 public View newView (Context context, Cursor cursor, ViewGroup parent){
      long id = cursor.getLong(TodoDbAdapter.ROW_ID_COLUMN);
      LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      if (existAlarm(id)){
           return inflater.inflate(R.layout.todo_row_green, null);
      } else {
           return inflater.inflate(R.layout.todo_row, null);
      }
 }

Je ne sais pas si j'ai bien compris votre code, mais vous pouvez adapter cela à vos besoins.

0voto

Femi Points 42054

Il est tout à fait possible d'utiliser une vue différente pour chaque ligne : vous ne pouvez cependant pas utiliser un SimpleCursorAdapter standard pour cela : vous devez surcharger la fonction getView(). Un exemple se trouve à Essayer de surcharger getView dans un SimpleCursorAdapter donne lieu à NullPointerExceptio. (il y a quelques erreurs qui sont répondues dans le post, mais la technique de base est correcte).

Pour ce qui est de n'afficher que le dernier message, votre code crée un NOUVEL adaptateur SimpleCursorAdapter pour chaque ligne, ce qui est incorrect. Vous devez utiliser la surcharge getView() et ensuite faire la boucle for et la comparaison à l'intérieur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X