我是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 即可。我将数据存储在自定义类中,并且还使用自定义适配器。
答案 0 :(得分:2)
要刷新适配器,您可以使用:
adapter.notifyDataSetChanged();
notifyDataSetChanged
void notifyDataSetChanged()
通知附加的观察者基础数据已被更改,反映数据集的任何视图都应自行刷新。
此处有更多信息:https://developer.android.com/reference/android/widget/BaseAdapter.html#notifyDataSetChanged()
答案 1 :(得分:0)
是的,我做到了。
我在我的数据库引用的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();
}
}
答案 2 :(得分:0)
尝试
adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@Override
public void onItemRangeInserted(int positionStart, int itemCount) {
super.onItemRangeInserted(positionStart, itemCount);
recycler_view.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
});
答案 3 :(得分:-1)
在插入数据时会触发CompletionListener
,这意味着您不需要对数据库进行任何其他更改,以便在客户端设备上显示某些内容(正在进行更改的内容)。< / p>
简单地说:在CompletionListener
内更新特定的recycleView记录。您可以使用notifyItemChanged(position)
或notifyItemChanged(position, payload)
执行此操作,
考虑第一次调用,您必须更改适配器中onBindViewHolder
内使用的数据记录,或者您可以为onBindViewHolder
中将使用的适配器设置一个标志。第二次通话使您可以传递任何其他数据。
请注意,notifyItemChanged(position, payload)
来电是第一位且内部有notifyItemChanged(position)
来电。您还需要其他信息吗?
答案 4 :(得分:-1)
要仅为更改的项目刷新适配器,请在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;
}
}
}
请确保您的消息模型类中的每个消息及其获取器都有唯一的消息ID,在上面的示例中,这被称为MessageID和获取器getMessageID()。