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

问题描述 投票:2回答:2

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

我使用[[RecyclerView

]后,我的FirebaseRecyclerAdapter实时数据发生了很好的变化在集合中,该数据文档的字段类型为Boolean , Integer, Reference

[希望使用该引用从populateViewHolderaddSnapshotListener中获取数据

帮帮我!这是我的代码:

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,则一旦不需要该Detach a listener,则必须将其删除

当您不再对侦听数据感兴趣时,必须分离侦听器,以使事件回调不再被调用。这允许客户端停止使用带宽来接收更新。您可以使用onSnapshot()上的取消订阅功能停止收听更新。

我已经用FirebaseUI-Android库实现了RecyclerView。一旦我使用FirebaseRecyclerAdapter In Collection中的数据文档的字段类型为...

java android firebase google-cloud-firestore firebaseui
2个回答
5
投票
要实现这一点,您需要像这样使用EventListener<DocumentSnapshot>

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


0
投票
还有一种删除监听器的更优雅的方法,该方法是将活动作为addSnapshotListener()方法中的第一个参数传递,因此Firestore可以在活动停止时自动清理监听器。Blockquote
© www.soinside.com 2019 - 2024. All rights reserved.