java - FirebaseListAdapter no empuja elementos individuales para la aplicación de chat-Firebase-Ui 3.1
android firebase-realtime-database (2)
Para permitir que FirebaseRecyclerAdapter y FirebaseListAdapter muestren los datos de la actividad
Necesitas usar esto:
@Override
protected void onStart() {
super.onStart();
adapter.startListening();
}
@Override
protected void onStop() {
super.onStop();
adapter.stopListening();
}
Dado que
FirebaseListAdapter
usa un agente de escucha para verificar los cambios en la base de datos de firebase, para estar escuchando los datos, debe agregar
adapter.startListening()
dentro de
onStart()
para poder mostrar los datos en la vista de lista.
Luego, dentro de
onStop()
(cuando se detiene la actividad), puede usar
adapter.stopListening()
para eliminar el oyente y los datos en el adaptador.
Consulte esto para obtener más información: Adaptador LifeCycle
Nota:
Si después de usar lo anterior, obtiene una
nullpointexception
o
cannot resolve symbol
, debe declarar el
adapter
como variable global y verifique la siguiente respuesta:
Error en startListening ()
Estoy creando una aplicación de chat en Android que utiliza google firebase para almacenar mensajes que los usuarios se escriben entre sí. Para mostrar estos mensajes a los usuarios, los leo de la base de datos y los organizo en un ListView personalizado con un ListAdapter. Esto funcionaba bien hasta que actualicé mis dependencias, específicamente la interfaz de usuario de Firebase para:
com.firebaseui:firebase-ui:3.1.0
Ahora el código para construir el adaptador de lista no funciona, siendo:
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()));
}
};
Para solucionar este problema, actualicé el código para cumplir con los nuevos requisitos de interfaz de usuario de Firebase, haciendo que el código se convierta en:
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()));
}
};
Este código se compila bien ahora, pero la vista de lista no muestra los datos. ¿Hay una forma correcta específica de usar la nueva dependencia de la interfaz de usuario de Firebase para hacer el adaptador de lista?
Además de lo que se dijo en
la respuesta de Peter
, de acuerdo con la última
documentation
API de FirebaseRecyclerAdapater, puede crear un
FirebaseRecyclerAdapter
pase en una instancia de
FirebaseRecyclerOptions
creada por un constructor.
En el generador, especifique un propietario del ciclo de vida para que no tenga que modificar ni su
onStart
ni su
onStop
manualmente:
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)
}
}
}
El generador de opciones está compuesto por un método setQuery que toma una referencia a la base de datos y un objeto modelo; el setLifecycleOwner que toma la actividad que activará las actualizaciones del adaptador.