问题描述
我已经使用 FirebaseUI-Android库 实现了RecyclerView
.
我使用 FirebaseRecyclerAdapter
My RecyclerView
realtime data change well once i use that FirebaseRecyclerAdapter
在集合中,该数据文档的字段类型为布尔值,整数,引用.
In Collection that data document have field type as Boolean , Integer, Reference.
我希望使用该引用通过addSnapshotListener
在populateViewHolder
中获取数据.
救救我!这是我的代码:
Help me! Here is my code:
FirebaseRecyclerAdapter<Conv, ConvViewHolder> firebaseConvAdapter = new FirebaseRecyclerAdapter<Conv, ConvViewHolder>(
Conv.class,
R.layout.users_single_layout,
ConvViewHolder.class,
conversationQuery
) {
@Override
protected void populateViewHolder(final ConvViewHolder convViewHolder, final Conv conv, int i) {
final String list_user_id = getRef(i).getKey();
final DocumentReference docRef = db.collection("cities").document(list_user_id);
docRef.addSnapshotListener(new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(@Nullable DocumentSnapshot snapshot,
@Nullable FirebaseFirestoreException e) {
if (e != null) {
Log.w(TAG, "Listen failed.", e);
return;
}
if (snapshot != null && snapshot.exists()) {
Log.d(TAG, "Current data: " + snapshot.getData());
} else {
Log.d(TAG, "Current data: null");
}
}
});
}
};
mConvList.setAdapter(firebaseConvAdapter);
Firebase说,如果您添加addSnapshotListener,则必须将其删除一次,无需该分离听众
Firebase saying if you add addSnapshotListener then must to remove it once no need for that Detach a listener
推荐答案
要实现此目的,您需要使用如下的EventListener<DocumentSnapshot>
:
To achieve this, you need to use a EventListener<DocumentSnapshot>
like this:
EventListener<DocumentSnapshot> eventListener = new EventListener<DocumentSnapshot>() {
@Override
public void onEvent(DocumentSnapshot snapshot, FirebaseFirestoreException e) {
if (snapshot != null && snapshot.exists()) {
//Do what you need to do
}
}
};
声明一个全局ListenerRegistration listenerRegistration;
变量,并在需要的地方添加SnapshotListener,如下所示:
Declare a global ListenerRegistration listenerRegistration;
variable and add the SnapshotListener in the place where is needed like this:
if (listenerRegistration == null ) {
listenerRegistration = yourRef.addSnapshotListener(eventListener);
}
要删除侦听器,只需在onStop()
方法中使用以下代码行:
To remove the listener, just use the following lines of code, in your onStop()
method:
@Override
protected void onStop() {
if (listenerRegistration != null) {
listenerRegistration.remove();
}
}
此外,一旦调用onStart()
方法,别忘了再次添加它.
Also, don't forget to add it again once your onStart()
method is called.
@Override
protected void onStart() {
super.onStart();
listenerRegistration = yourRef.addSnapshotListener(eventListener);
}
当您呼叫addSnapshotListener
进行收听实时更新,这意味着您将附加一个侦听器,该侦听器将针对数据库中发生的每个更改而被调用.因此,当您关闭应用程序时也会发生这种情况,这就是为什么必须强制在活动被销毁之前,先将监听器分离.
When you are calling addSnapshotListener
for listening to realtime updates, it means that you attach a listener that gets called for every change that takes place in your database. So this is happening also when your app is closed, that's why it's mandatory to detach the listeners before the activity gets destroyed.
如果您不需要在应用中实时获取数据,则只需使用 get()直接在引用上调用,该引用仅读取一次文档.由于它仅读取一次,因此没有要删除的侦听器.这是Firebase实时数据库中使用的addListenerForSingleValueEvent()
的对应物.
If in your app you don't need to get the data in realtime, then you can simply use a get() call directly on the reference, which just reads the document only once. Since it only reads once, there is no listener to be removed. This is the correspondent of addListenerForSingleValueEvent()
used in the Firebase realtime database.
还有一种删除监听器的更优雅的方法,该方法就是将活动作为第一个参数传递给 addSnapshotListener( )方法,这样Firestore可以在活动停止时自动清除监听器.
There is also a more elegant way for removing the listener which is to pass the activity as first the argument in the addSnapshotListener() method, so Firestore can clean up the listeners automatically when the activity is stopped.
ListenerRegistration lg = yourDocumentRef
.addSnapshotListener(YourActivity.this, eventListener);
这篇关于如何设置addSnapshotListener并在RecyclerView Item中的populateViewHolder中删除?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!