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