web-dev-qa-db-fra.com

FirebaseListAdapter n'insérant pas d'éléments individuels pour l'application de discussion - Firebase-Ui 3.1

Je crée une application de chat sur Android qui utilise Google Firebase pour stocker les messages que les utilisateurs écrivent les uns aux autres. Pour afficher ces messages aux utilisateurs, je les ai lus à partir de la base de données et les ai organisés en un ListView personnalisé avec un ListAdapter. Cela fonctionnait bien jusqu'à ce que je mette à jour mes dépendances, en particulier firebase ui:

com.firebaseui:firebase-ui:3.1.0

Maintenant, le code pour construire l'adaptateur de liste ne fonctionne pas, c'est-à-dire:

adapter = new FirebaseListAdapter<ChatMessage>(FirebaseDatabase.getInstance().getReference("Lobbies").child(leaderID).child("Messages"), ChatMessage.class, R.layout.message, this) {
        @Override
        protected void populateView(View v, ChatMessage model, int position) {
            // Get references to the views of message.xml
            TextView messageText = (TextView)v.findViewById(R.id.message_text);
            TextView messageUser = (TextView)v.findViewById(R.id.message_user);
            TextView messageTime = (TextView)v.findViewById(R.id.message_time);

            // Set their text
            messageText.setText(model.getMessageText());
            messageUser.setText(model.getMessageUser());

            // Format the date before showing it
            messageTime.setText(DateFormat.format("dd-MM-yyyy (HH:mm:ss)",
                    model.getMessageTime()));
        }
    };

Pour résoudre ce problème, j'ai mis à jour le code afin qu'il soit conforme aux nouvelles exigences de l'interface utilisateur de Firebase, le rendant ainsi:

FirebaseListOptions<ChatMessage> options = new FirebaseListOptions.Builder<ChatMessage>()
            .setQuery(FirebaseDatabase.getInstance().getReference("Lobbies").child(leaderID).child("Messages"), ChatMessage.class).setLayout(R.layout.message).build();

    adapter = new FirebaseListAdapter<ChatMessage>(options) {
        @Override
        protected void populateView(View v, ChatMessage model, int position) {
            // Get references to the views of message.xml
            TextView messageText = v.findViewById(R.id.message_text);
            TextView messageUser = v.findViewById(R.id.message_user);
            TextView messageTime = v.findViewById(R.id.message_time);

            // Set their text
            messageText.setText(model.getMessageText());
            messageUser.setText(model.getMessageUser());

            // Format the date before showing it
            messageTime.setText(DateFormat.format("dd-MM-yyyy (HH:mm:ss)",
                    model.getMessageTime()));
        }
    };

Ce code se compile bien maintenant, mais la listview n’affiche pas les données. Existe-t-il un moyen spécifique d'utiliser la nouvelle dépendance d'interface utilisateur Firebase pour créer l'adaptateur de liste?

9
Dylan Kane

Pour que FirebaseRecyclerAdapter et FirebaseListAdapter affichent les données de l'activité

Vous devez utiliser ceci:

@Override
protected void onStart() {
super.onStart();
adapter.startListening();
}


@Override
protected void onStop() {
super.onStop();
adapter.stopListening();
}

Étant donné que FirebaseListAdapter utilise un écouteur pour vérifier les modifications apportées à la base de données firebase, pour écouter les données, vous devez ajouter adapter.startListening() dans la onStart() afin de pouvoir afficher les données dans la liste.

Ensuite, dans onStop() (lorsque l'activité est arrêtée), vous pouvez utiliser adapter.stopListening() pour supprimer l'écouteur et les données de l'adaptateur.

Vérifiez ceci pour plus d’informations: Adapter LifeCycle

Remarque:

Si après avoir utilisé ce qui précède, vous obtenez une nullpointexception ou cannot resolve symbol, vous devez déclarer adapter comme variable globale et vérifier la réponse ci-dessous: Erreur dans startListening ()

17
Peter Haddad

En plus de ce qui a été dit dans la réponse de Peter , selon FirebaseRecyclerAdapater dernière api documentation , vous pouvez créer une variable FirebaseRecyclerAdapter en passant par une instance FirebaseRecyclerOptions créée par un générateur. Dans le générateur, vous spécifiez un propriétaire de cycle de vie afin de ne pas avoir à modifier manuellement sa onStart ou sa onStop:

private fun MainActivity.setUpFirebaseRecyclerAdapter():
    FirebaseRecyclerAdapter<User, ListOnlineViewHolder> {

val options = FirebaseRecyclerOptions.Builder<User>()
        .setQuery(ONLINE_USERS.limitToLast(10), User::class.Java)
        .setLifecycleOwner(this)
        .build()

return object : FirebaseRecyclerAdapter<User, ListOnlineViewHolder>(options){
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ListOnlineViewHolder {
        return ListOnlineViewHolder(
                LayoutInflater.from(parent.context)
                        .inflate(R.layout.user_layout, parent, false))
    }
    override fun onBindViewHolder(holder: ListOnlineViewHolder, position: Int, model: User) {
        holder.bindMessage(model)
    }
}
}

Le générateur d'options est composé d'une méthode setQuery qui inclut une référence à la base de données et un objet de modèle. setLifecycleOwner qui prend en charge l'activité qui déclenchera les mises à jour de l'adaptateur.

0
glisu