【问题标题】:Updating RecyclerView On Firebase Database onDataChange在 Firebase 数据库 onDataChange 上更新 RecyclerView
【发布时间】:2020-12-14 00:20:28
【问题描述】:

我是 recyclerView 的新手。我正在创建一个应用程序,在该应用程序中,当我将数据发送到firebase 数据库时,带有复选标记的图像视图与recyclerView 中的数据一起表明我的数据已到达数据库。

我通过创建一个子键来做到这一点,该子键将值从处理设置为在数据到达服务器时到达。

我还创建了一个imageView,如果消息已到达,它将其资源设置为复选标记。 到目前为止,它工作正常。但问题是我的 recyclerView 不会在同一时刻刷新。

如果我按下返回按钮(甚至关闭活动)然后返回到相同的活动,图像视图现在就在那里。 因此,您可以理解我到目前为止完成的任务正在正常工作。 我什至知道通过向我的 recyclerView 添加监听器可以解决这个问题。

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

但我已经尝试了所有方法来刷新我的 recyclerView 以了解孩子的变化。

但是它不起作用。当firebase 中的子更改时,我现在已经删除了我的命令。 请帮助我,以便我可以在孩子发生变化时刷新我的recyclerView

附言。我将数据存储在自定义类中,并且还使用自定义适配器。

【问题讨论】:

    标签: java android firebase firebase-realtime-database android-recyclerview


    【解决方案1】:

    要刷新适配器,您可以使用:

    adapter.notifyDataSetChanged();
    

    notifyDataSetChanged

    void notifyDataSetChanged ()

    通知附加的观察者底层数据已更改,任何反映数据集的视图都应自行刷新。

    更多信息在这里:https://developer.android.com/reference/android/widget/BaseAdapter.html#notifyDataSetChanged()

    【讨论】:

      【解决方案2】:

      是的,我做到了。
      我在我的数据库引用的 childEventListener 的 OnChildChanged 方法中执行了此操作。

                      @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();
                      }
                  }
      

      【讨论】:

        【解决方案3】:

        试试这个

          adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
                @Override
                public void onItemRangeInserted(int positionStart, int itemCount) {
                    super.onItemRangeInserted(positionStart, itemCount);
        
                    recycler_view.setAdapter(adapter);
                    adapter.notifyDataSetChanged();
        
                }
            });
        

        【讨论】:

          【解决方案4】:

          您的CompletionListener 会在数据已插入时触发,这意味着您不需要对数据库进行任何额外更改即可在客户端设备上显示某些内容(同一台设备正在进行更改)。

          很简单:在CompletionListener里面更新具体的recycleView记录。您可以使用notifyItemChanged(position)notifyItemChanged(position, payload) 执行此操作, 考虑到第一次调用,您必须更改适配器中onBindViewHolder 中使用的数据记录,或者您可以为将在onBindViewHolder 中使用的适配器设置一个标志。第二次调用使您可以传递任何其他数据。

          请记住,notifyItemChanged(position, payload) 调用是第一个调用,其中有 notifyItemChanged(position) 调用。您需要任何其他信息吗?

          【讨论】:

            【解决方案5】:

            要仅为更改的项目刷新适配器,请在 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;
                        }
                    }
            }
            

            确保在 Message 模型类中为每条消息及其 getter 提供唯一的消息 ID,在上面的示例中,这称为 MessageID,getter getMessageID()。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-06-12
              • 1970-01-01
              • 2017-08-04
              • 2020-11-18
              • 1970-01-01
              相关资源
              最近更新 更多