Soy nuevo en recyclerView. Estoy creando una aplicación en la que cuando envío mis datos a la base de datos firebase, aparece una vista de imagen con una marca de verificación con mis datos en recyclerView indicando que mis datos han llegado a la base de datos.

Hice esto creando una clave secundaria que establece el valor del procesamiento al alcanzado cuando los datos han llegado a los servidores.

También creé un imageView que establece su recurso como marca de verificación si el mensaje ha llegado. Hasta ahora funciona bien. Pero el problema es que mi recyclerView no se actualiza en el mismo momento.

Si presiono el botón Atrás (incluso cerrar la actividad) y luego vuelvo a la misma actividad, la vista de imagen ahora está allí. Por lo tanto, puede comprender que mi tarea realizada hasta ahora funciona correctamente. Incluso sé que al agregar oyente a mi recyclerView puede manejar este problema.

FirebaseDatabase.getInstance().getReference().child("message").push().setValue(newMessage, new DatabaseReference.CompletionListener() {
  @Override
    public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
      databaseReference.child("reachedServer").setValue("reached");
    }
});

Pero he intentado todo para actualizar mi recyclerView en el cambio infantil.

Pero simplemente no funciona. Ahora he borrado mis comandos cuando el niño cambia en firebase. Ayúdame para que pueda actualizar mi recyclerView cuando el niño cambie.

PS . Almaceno mis datos en mi clase personalizada y también uso un adaptador personalizado.

1
Anuj Kumar 27 feb. 2018 a las 13:11

4 respuestas

La mejor respuesta

Sí, lo hice.
Hice esto en OnChildChanged Method Of childEventListener de mi referencia de base de datos.

                @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {
                if (dataSnapshot.getValue() != null) {
                    Message newMessage = dataSnapshot.getValue(Message.class);
                    if (newMessage != null) {
                        for (int i = 0; i < myArrayList().size(); i++) {
                            if (myArrayList().get(i).timestamp == newMessage.timestamp) {
                                myArrayList().remove(i);
                                myArrayList().add(i, newMessage);
                                break;
                            }
                        }
                    }
                    adapter.notifyDataSetChanged();
                }
            }
1
Anuj Kumar 1 mar. 2018 a las 11:03

Para actualizar el adaptador, puede usar:

adapter.notifyDataSetChanged();

notifyDataSetChanged

void notifyDataSetChanged ()

Notifica a los observadores adjuntos que los datos subyacentes han cambiado y que cualquier Vista que refleje el conjunto de datos debería actualizarse.

Más información aquí: https://developer.android.com/ reference / android / widget / BaseAdapter.html # notifyDataSetChanged ()

3
Peter Haddad 27 feb. 2018 a las 10:28

Su CompletionListener se activa cuando los datos ya están insertados, lo que significa que no necesita ningún cambio adicional en su base de datos para mostrar algo en su dispositivo cliente (el mismo, que estaba haciendo cambios).

Simplemente: dentro de CompletionListener actualice el registro específico de recycleView. Puede hacer esto con notifyItemChanged(position) o notifyItemChanged(position, payload), teniendo en cuenta la primera llamada, debe cambiar el registro de datos que se usa dentro de onBindViewHolder en su adaptador, o puede establecer un indicador para ese adaptador que se usará en onBindViewHolder. La segunda llamada le brinda disponibilidad para pasar cualquier información adicional.

Tenga en cuenta que la llamada notifyItemChanged(position, payload) es primera y tiene una llamada notifyItemChanged(position) dentro. ¿Necesitas alguna información adicional?

-1
Max Aves 27 feb. 2018 a las 10:19

Para actualizar el adaptador, use el siguiente código en su método onChildChaged ():

@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
        Message message = dataSnapshot.getValue(Message.class);

        for (int i = 0; i < messagesList.size(); i++) {
            if (messagesList.get(i).getMessageID().equals(message.getMessageID())) {
                messagesList.set(i, message);
                adapter.notifyItemChanged(i);
                break;
            }
        }
}

Asegúrese de tener una ID de mensaje única para cada mensaje y su captador en su clase de modelo de mensaje; en el ejemplo anterior, esto se llamó MessageID y el captador getMessageID ().

-1
Sam Shaba 6 mar. 2020 a las 15:05