Java 在Firebase数据库onDataChange上更新RecyclerView

Java 在Firebase数据库onDataChange上更新RecyclerView,java,android,firebase,firebase-realtime-database,android-recyclerview,Java,Android,Firebase,Firebase Realtime Database,Android Recyclerview,我是新来的。我正在创建一个应用程序,在该应用程序中,当我将数据发送到firebase数据库时,会出现一个带有复选标记的图像视图,在recyclerView中显示我的数据已到达数据库 为此,我创建了一个子键,该子键将数据到达服务器时的值从处理设置为到达 我还创建了一个imageView,如果消息已到达,则将其资源设置为复选标记。 到目前为止,它运作良好。但问题是我的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");
    }
});
但我已经尝试了所有的方法来更新我关于儿童变化的回收视图

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


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

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

简单地说:在
CompletionListener
内部更新特定的recycleView记录。您可以使用
notifyItemChanged(位置)
notifyItemChanged(位置,有效负载)
来执行此操作, 考虑到第一次调用,您必须更改适配器中
onBindViewHolder
内部使用的数据记录,或者您可以为将在
onBindViewHolder
中使用的适配器设置一个标志。第二次呼叫使您可以传递任何附加数据


请记住,
notifyItemChanged(位置,有效负载)
调用是第一个,并且它内部有
notifyItemChanged(位置)
调用。是否需要其他信息?

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

adapter.notifyDataSetChanged();
notifyDataSetChanged

void notifyDataSetChanged()

通知附加的观察者基础数据已更改,任何反映数据集的视图都应刷新自身

更多信息:是的,我做到了。
我在数据库引用的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();
                }
            }
@覆盖
公共void onChildChanged(DataSnapshot DataSnapshot,字符串s){
if(dataSnapshot.getValue()!=null){
Message newMessage=dataSnapshot.getValue(Message.class);
if(newMessage!=null){
对于(int i=0;i
要仅为更改的项目刷新适配器,请在onchildhaged()方法上使用以下代码:

@覆盖
公共void onChildChanged(DataSnapshot DataSnapshot,字符串s){
Message Message=dataSnapshot.getValue(Message.class);
对于(int i=0;i
确保消息模型类中的每条消息及其getter都有一个唯一的消息ID,在上面的示例中,这被称为MessageID和getter getMessageID()。

试试这个

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

            recycler_view.setAdapter(adapter);
            adapter.notifyDataSetChanged();

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

            recycler_view.setAdapter(adapter);
            adapter.notifyDataSetChanged();

        }
    });