Maison > Java > javaDidacticiel > Comment afficher efficacement les données Firebase dans une liste Android ?

Comment afficher efficacement les données Firebase dans une liste Android ?

Mary-Kate Olsen
Libérer: 2024-12-09 21:26:15
original
216 Les gens l'ont consulté

How to Efficiently Display Firebase Data in an Android ListView?

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 + '\'' +
                '}';
    }
}
Copier après la connexion

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);
            }
Copier après la connexion

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);
Copier après la connexion

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);
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal