java android firebase firebase-realtime-database firebaseui

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.