如何在RecyclerView项中的populateViewHolder中设置addSnapshotListener并删除?
我已经使用FirebaseUI-Android库实现了RecyclerView
。
一旦我使用FirebaseRecyclerAdapter
我的RecyclerView
实时数据就会发生变化
在Collection中,数据文档的字段类型为Boolean,Integer,Reference 。
我想使用Reference来使用addSnapshotListener
在populateViewHolder
获取数据 。
帮我! 这是我的代码:
FirebaseRecyclerAdapter firebaseConvAdapter = new FirebaseRecyclerAdapter( 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() { @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,那么一旦不需要分离监听器就必须删除它
当您不再对收听数据感兴趣时,必须分离监听器,以便停止调用事件回调。 这允许客户端停止使用带宽来接收更新。 您可以使用
onSnapshot()
上的取消订阅function来停止收听更新。
要实现这一点,您需要使用EventListener
如下所示:
EventListener eventListener = new EventListener () { @Override public void onEvent(DocumentSnapshot snapshot, FirebaseFirestoreException e) { if (snapshot != null && snapshot.exists()) { //Do what you need to do } } };
然后声明一个全局的ListenerRegistration listenerRegistration;
字段并在需要的地方添加SnapshotListener,如下所示:
if (listenerRegistration == null ) { listenerRegistration = yourRef.addSnapshotListener(eventListener); }
要删除侦听器,只需在onStop()
方法中使用以下代码行:
@Override protected void onStop() { if (listenerRegistration != null) { listenerRegistration.remove(); } }
另外,一旦onStart()
方法,不要忘记再次添加它。
@Override protected void onStart() { super.onStart(); listenerRegistration = yourRef.addSnapshotListener(eventListener); }