2

Я создаю приложение чата с использованием базы данных Firebase Realtime. Я хочу реализовать такие функции, как WhatsApp, где пользователь может отправлять сообщение без Интернета (Добавить объект сообщения на RecyclerView), но будет иметь значок часов (Чтобы показать, что сообщение еще не было отправлено).Обновить элемент recyclerview ui в клиенте, чтобы указать, что база данных Firebase на сервере обновлена ​​

Когда база данных Firebase получает сообщение (Абонентское устройство подключается к Интернету и Firebase посылает сообщение), я хочу, чтобы обновить добавленный элемент на recyclerview (изменить значок часов для положительного значок) ,

Что я пробовал? У меня есть, что

mFirebaseDatabaseReference = FirebaseDatabase.getInstance().getReference(); 
    mFirebaseAdapter = new ChatFirebaseAdapter(mFirebaseDatabaseReference.child("chat_id"), user.getId()); 
recyclerChat.setLayoutManager(mLinearLayoutManager); 
    recyclerChat.setAdapter(mFirebaseAdapter); 

Мой адаптер расширяет FirebaseRecyclerAdapter от firebase-ui-database

Я пытался добавить addChildEventListener на моем DatabaseReference где я получаю dataSnapshot нового элемента, но я не знаю, как получить право позицию по рециклированию.

mFirebaseDatabaseReference.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
      UPDATE RECYCLERVIEW ITEM 
     } 

     @Override 
     public void onChildChanged(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onChildRemoved(DataSnapshot dataSnapshot) { 

     } 

     @Override 
     public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

Я добавил onCompletionListener, когда я добавить новое сообщение, но я не знаю, как получить правильную позицию снова.

mFirebaseDatabaseReference.push().setValue(message, new DatabaseReference.CompletionListener() { 
     @Override 
     public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) { 
      if (databaseError == null) { 
       UPDATE RECYCLERVIEW ITEM 
      } 
     } 
    }); 

У кого-то есть идея, почему я не могу это сделать? Благодарю. Я много искал, прежде чем спросил, но я не нашел правильного ответа.

ответ

3

Решение вашей проблемы заключается в добавлении поставляется булевым, который может быть установлен в истинную и как только вы получите успешный нажимной идентификатор из кода в onCompletionListener, то все, что вам нужно сделать, это установить это логическое значение тому, что конкретный идентификатор push.

Теперь на вашем Android-клиенте в вашей firebase ui вы можете проверить, установлено ли это логическое значение true и соответствующим образом изменить состояние элементов вида ресайклеров. Это решение будет работать, поскольку база данных firebase в режиме реального времени.

// установка булево OnComplete

mFirebaseDatabaseReference.push().setValue(message, new DatabaseReference.CompletionListener() { @Override public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) { if (databaseError == null) { databaseReference.child("delivered").setValue(true); } } }); 

Для чата приложений, как WhatsApp, мессенджер и т.д. Вы бы другой маршрут сообщений, если не используется в качестве firebase backened. Который я не обсуждаю здесь, поскольку это выходит за рамки заданного вопроса.

+0

Привет, Нишан, спасибо за ответ. Действительно, я использую этот учебник. Но не показывайте, как я могу проверить, получил ли сервер сообщение (я получаю это с помощью слушателя), и как получить позицию из переработанного представления, чтобы обновить значок. –

+0

. Идентификаторы push помогут вам исправить ребенка. Посмотрите на редактирование. –

+0

Да Nishant, я получаю идентификаторы добавленного ребенка. Как я могу использовать это для обновления recyclerView. Каково отношение генерации и позиции элемента в просмотре ресайклеров. Если бы вы могли сказать мне, что я добьюсь своей цели. –