当前位置: 首页 > 知识库问答 >
问题:

如何在RecyclerView项中设置addSnapshotListener和在PopulateViewWholder中删除?

蓝昊天
2023-03-14

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

         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,则必须删除它,而不需要分离监听器

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

共有1个答案

郭元凯
2023-03-14

为此,您需要使用EventListener ,如下所示:

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,如下所示:

if (listenerRegistration == null ) {
    listenerRegistration = yourRef.addSnapshotListener(eventListener);
}

要删除侦听器,只需在onstop()方法中使用以下代码行:

@Override
protected void onStop() {
    if (listenerRegistration != null) {
        listenerRegistration.remove();
    }
}
@Override
protected void onStart() {
    super.onStart();
    listenerRegistration = yourRef.addSnapshotListener(eventListener);
}

如果在应用程序中不需要实时获取数据,那么您可以直接对引用使用get()调用,它只读取文档一次。由于它只读取一次,因此没有要删除的侦听器。这是Firebase实时数据库中使用的AddListenerForSingleValueEvent()的对应项。

还有一种更好的方法可以删除监听器,即首先将活动作为addSnapshotListener()方法中的参数传递,这样Firestore就可以在活动停止时自动清理监听器。

ListenerRegistration lg = yourDocumentRef
            .addSnapshotListener(YourActivity.this, eventListener);
 类似资料:
  • 在recyclerView中获取已点击项目的位置,我在recyclerView中创建cardview和链接 我想获取位置,将开关盒设置为每个卡视图的意向活动 当我点击card view I时,他会打开另一个页面,当你点击card view 2时,他会打开另一个页面。 看看我的密码 在recyclerView中获取已点击项目的位置,我在recyclerView中创建cardview和链接 我想获取位

  • 如何从XML设置RecyclerView layoutManager?

  • 关于首选项 为了让 Illustrator 根据您特定的工作流程尽可能流畅地运行,您需要根据自己的喜好设置首选项。 许多程序设置都存储在 Adobe Illustrator Prefs 文件中,其中包括常规显示选项、文件存储选项、性能选项、文字选项以及增效工具和暂存盘选项。其中大多数选项都是在首选项对话框中设置的。每次退出应用程序时都会存储首选项设置。 如果出现异常现象,可能是因为首选项已损坏。如

  • 我在NestedScrollView中有一个RecyclerView。当recyclerView适配器列表较小时,它工作正常。但当列表太大时,它会使我的应用程序崩溃(或造成更多延迟)。我该怎么修呢。代码如下。 XML: 爪哇:

  • 好的,所以这有点复杂,我有一个自定义的RecolyerView适配器,在OnBindViewWholder方法中,我希望根据一些不同的变量从RecolyerView中删除当前项,但当我从ArrayList中删除该项并调用得到:。 如何从OnBindViewWholder中的RecyclerView中删除该项?,我不想在设置适配器之前这样做,因为recyclerview中的每个项都有一个子列表,如果

  • 问题内容: 我想要一个使用样式的单元格。 我最初的Objective-C代码是: 在已经在SO上搜索了几个问题之后,我想像这样在Swift中编写它: 但这并不能让我说我想要一种风格。所以我尝试了这个: 这给了我一个牢房,但是却没有让我。 我已经研究了更多内容,并观看了此视频教程,但是他创建了一个单独的对象,我认为这是不必要的,因为我之前在Obj- C中实现了相同的效果。 有任何想法吗?谢谢。 问题