只使用从数据库中检索的消息填充viewHolder?

7 java android firebase firebase-realtime-database firebaseui

我正在关注Android Firebase Codelab.

这是我试图修改的友好聊天应用程序的项目:https://github.com/firebase/friendlychat-android/tree/master/android

我希望只有在从数据库中检索消息后才能填充MessageViewHolder .不幸的是,现在,MessageViewHolder也会在本地填充(在用户按下'SEND'之后).我不希望后者发生.这意味着视图持有者会更新两次(一次在本地,一次从数据库中检索),这是低效的.

侧节点:此外,当用户按下'SEND'并看到他的MessageViewHolder填充了他的消息时,用户可能会认为他在线.这是不需要的!

请转到MainActivity的第177行查看populateViewHolder方法.

在过去的几个月里,我一直试图回避这个问题,但现在我真的需要解决这个问题才能继续工作.为实现我想要的目标,我必须做出哪些改变?

Jan*_*ain 0

使用事务发送消息,而不是setValue。这样你就可以确定你正在在线拨打电话,并且如果(没有检查这一点,但应该是)侦听器是 ValueEventListener,那么如果离线,则不会调用此侦听器。

如果添加了数据,您将看到这一点,否则不会(如果未在本地添加)创建事务时,您可以在 onComplete 中检查消息是否也已发送

只需使用databaseReference.runTransaction(transactionHandler, false)

为了确保事务仅在数据库连接时运行,您可以检查之前是否连接了 firebasedatabaseReference.runTransaction

    override fun doTransaction(p0: MutableData?): Transaction.Result {
                    p0?.value = objectToPut
                    return Transaction.success(p0)
    }
Run Code Online (Sandbox Code Playgroud)

有关交易的更多信息:https ://firebase.google.com/docs/database/android/read-and-write#save_data_as_transactions

如何检查是否在线:

DatabaseReference connectedRef = FirebaseDatabase.getInstance().getReference(".info/connected");
connectedRef.addValueEventListener(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot snapshot) {
    boolean connected = snapshot.getValue(Boolean.class);
    if (connected) {
      System.out.println("connected");
    } else {
      System.out.println("not connected");
    }
  }

  @Override
  public void onCancelled(DatabaseError error) {
    System.err.println("Listener was cancelled");
  }
});
Run Code Online (Sandbox Code Playgroud)