Affichage des données Firebase dans ListView
L'un des défis courants auxquels les développeurs sont confrontés concerne l'affichage des données de Firebase dans une ListView. Récemment, un utilisateur a posté une question sur ce sujet, mettant en avant les problèmes rencontrés. Examinons leurs préoccupations et proposons des solutions.
Le problème
Leur code affichait initialement l'ID utilisateur, mais ne parvenait pas à afficher le score. Après avoir apporté quelques modifications, ils se sont retrouvés avec des valeurs nulles. Soupçonnant un problème de suppression ou de faute d'orthographe, ils ont demandé de l'aide.
Résoudre le problème
Après avoir examiné le code fourni, le problème provenait du non-respect des conventions de dénomination Java dans le modèle. classe. La classe doit être nommée « Score » et formatée comme suit :
public class Score { private String userId, score; public Score() {} public Score(String userId, String score) { this.userId = userId; this.score = score; } public String getUserId() { return userId; } public String getScore() { return score; } @Override public String toString() { return "Score{" + "userId='" + userId + '\'' + ", score='" + score + '\'' + '}'; } }
De plus, la nature asynchrone de la méthode onDataChange() faisait que la liste restait vide. Pour remédier à cela, la déclaration de liste doit être déplacée dans onDataChange().
Comportement asynchrone et récupération de données
Il est important de comprendre le comportement asynchrone de onDataChange() méthode. Dans ce cas, il est appelé avant même de tenter d'ajouter des objets à la liste. Par conséquent, toute tentative d'utilisation de la liste en dehors de cette méthode donnera des résultats vides.
Pour résoudre ce problème, la déclaration de liste peut être déplacée dans onDataChange(), comme le montre le code suivant :
dbref.addValueEventListener(new com.google.firebase.database.ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { ArrayList<String> list = new ArrayList<>(); for(DataSnapshot ds :dataSnapshot.getChildren()) { Score Result = ds.getValue(Score.class); String userId = String.valueOf(Result.getUserId()); String score = String.valueOf(Result.getScore()); list.add(userId); list.add(score); } adapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, list); LvRanking.setAdapter(adapter); }
Affichage des données à l'aide de la classe String
Pour afficher les données à l'aide de la classe String, vous pouvez utiliser ce qui suit code :
ListView listView = findViewById(R.id.list_view); List<String> list = new ArrayList<>(); ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, list); listView.setAdapter(arrayAdapter); DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); DatabaseReference scoreRef = rootRef.child("score"); ValueEventListener eventListener = new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { for(DataSnapshot ds : dataSnapshot.getChildren()) { String userId = ds.child("userId").getValue(String.class); String score = ds.child("score").getValue(String.class); list.add(userId + " / " + score); Log.d("TAG", userId + " / " + score); } arrayAdapter.notifyDataSetChanged(); } @Override public void onCancelled(DatabaseError databaseError) { Log.d(TAG, task.getException().getMessage()); } }; scoreRef.addListenerForSingleValueEvent(eventListener);
Affichage des données à l'aide de la classe Score
Alternativement, pour afficher les données à l'aide de la classe Score, utilisez le code suivant :
ValueEventListener eventListener = new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { for(DataSnapshot ds : dataSnapshot.getChildren()) { Score score = ds.getValue(Score.class); String userId = score.getUserId(); String score = score.getScore(); Log.d("TAG", userId + " / " + score); list.add(score); } arrayAdapter.notifyDataSetChanged(); } @Override public void onCancelled(DatabaseError databaseError) { Log.d(TAG, task.getException().getMessage()); } }; scoreRef.addListenerForSingleValueEvent(eventListener);
En suivant ces solutions, vous devriez pouvoir afficher avec succès les données Firebase dans un ListView.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!