如何在RecyclerView项中的populateViewHolder中设置addSnapshotListener并删除?

我已经使用FirebaseUI-Android库实现了RecyclerView

一旦我使用FirebaseRecyclerAdapter我的RecyclerView实时数据就会发生变化

在Collection中,数据文档的字段类型为Boolean,Integer,Reference 。

想使用Reference来使用addSnapshotListenerpopulateViewHolder获取数据

帮我! 这是我的代码:

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