android - 如何仅检索一次 Firebase 数据库值而不监听子值,即使它们已更改

标签 android firebase firebase-realtime-database android-recyclerview fragmentstatepageradapter

我有这样的场景,在我的应用程序中,我尝试查询子节点并将其传递到列表中的 recyclerview 适配器,当我向上滚动回收器 View 项目并且有人插入了帖子时,就会出现问题,我的 recyclerview 再次来到第一个帖子项目,而且我正在使用带有三个 fragment 的 viewpager,无论我在什么 fragment 上,如果有人插入了帖子如何解决这个问题,我都会回滚到第一个 fragment 。 我已经按照下面提到的方式实现了这一点。

我想的一种方式是,我认为我不会听子事件的更改,而是查询结果并稍后填充 recyclerview 不听子事件,这样一切都会按原样显示,我不知道在 firebase 中你怎么办在不实现监听器的情况下检索值我尝试了 singleValueEventListener,这样行为仍然相同,回滚到第一个项目或第一个 fragment

指导我解决如何摆脱这种行为的问题。

Query query= databasePostsReference.orderByChild("timestamp");

       query.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                List<UserPostPOJO> listposts = new ArrayList<UserPostPOJO>();
                for(DataSnapshot snapshot : dataSnapshot.getChildren()){
                    Log.d(TAG, "onDataChange: entered list adding");
                    UserPostPOJO post = 
                    snapshot.getValue(UserPostPOJO.class);
                    listposts.add(0,post);
                }
                if(listposts.isEmpty()){
                    empty.setVisibility(View.VISIBLE);
                    recyclerView.setVisibility(View.GONE);
                }
                else
                {
                    empty.setVisibility(View.GONE);
                    recyclerView.setVisibility(View.VISIBLE);
                    makelist(listposts);
                }


            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        }); 




private void makelist(List<UserPostPOJO> listposts) {
        list = listposts;
        Log.d(TAG,"size is "+ list.size()+"");

        recyclerView.setHasFixedSize(true);
        recyclerView.setLayoutManager(new 
        LinearLayoutManager(getActivity()));
        CustomRecyclerViewAdapter adapter = new 
        CustomRecyclerViewAdapter(getActivity(), list,"recentfragment");
        recyclerView.setAdapter(adapter);


    }

最佳答案

有一个名为 removeEventListener() 的方法,您可以调用该方法来删除特定的事件监听器。您从数据库中获取数据,然后调用此方法。因此,为了使其工作,请使用以下代码:

databaseReference.removeEventListener(valueEventListener);

其中databaseReference是您最初放置监听器的引用。

更多详情请阅读offcial doc .

希望有帮助。

关于android - 如何仅检索一次 Firebase 数据库值而不监听子值,即使它们已更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44166245/

相关文章:

RecyclerView Adapter 中的 Android ViewModel 用于惰性数据库下载

Android textview 一些表情符号没有显示?

android录制视频,初始化相机

javascript - 将 arraylist 中已表示的值添加到 arraylist 中

ios - 升级到 4.1.0 后,Firebase 查询在 iOS 上静默失败

swift - 如何检查 Firebase 数据库中的 3 个或更多值是否相同?

android - 如何使用 Jetpack Compose 隐藏 ActionBar

带有 AngularFire 的 Angular 拦截器

reactjs - 运行 firebase deploy 时找不到 404 页面

swift - 使用 Firebase 和 Swift 获取与特定用户关联的帖子