在FireData数据库onDataChange上更新RecyclerView

问题描述 投票:2回答:3

我是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

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

android firebase firebase-realtime-database android-recyclerview
3个回答
2
投票

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

adapter.notifyDataSetChanged();

notifyDataSetChanged

void notifyDataSetChanged()

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

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


1
投票

是的,我做到了。 我在我的数据库引用的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();
                }
            }

-1
投票

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

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

请记住,notifyItemChanged(position, payload)呼叫是第一,它内部有notifyItemChanged(position)呼叫。您还需要任何其他信息吗?

© www.soinside.com 2019 - 2024. All rights reserved.