Firebase数据库用户知道有两个基本监听器用于监听数据:ValueEventListener和ChildEventListener.当我们听一个对象时,它的效果非常好,当我们收听一些对象时变得相当困难.

要指出问题,让我们假设我们有HackerNews饲料,我们听听Firebase中的“posts”对象.

当然,在我们的应用程序中有RecyclerView显示帖子,我认为最好的主意是使用firebaseui,但问题是我们希望在更改服务器端或测试时使用更抽象的应用程序.所以我们会使用一些适配器,但这是另一个question.

我提到两个听众,问题是哪个更好?

当我们使用ValueEventListener时,我们将获得整个集合,但是如果有任何变化,像一个用户改变了内容,我们将不得不重新加载整个数据,这意味着更多的字节通过昂贵的网络传输发送.另一个问题是当我们使用多用户时,这里是例子:

> Post有userId,但是我们要显示他的名字,所以在onDataChanged方法中,我们获取了用户数据,如下所示:

postsReference.addValueEventListener(new ValueEventListener() {
     @Override
     public void onDataChange(DataSnapshot dataSnapshot) {
          for (DataSnapshot data : dataSnapshot.getChildren()) {
               Post post = data.getValue(Post.class);   
               usersReference.child(post.getUserId()).addListenerForSingleValueEvent(new ValueEventListener() {

                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            // Here we have user data
                        }

                        @Override
                        public void onCancelled(FirebaseError firebaseError) {

                        }
              });
          }
     }

     @Override
     public void onCancelled(FirebaseError firebaseError) {
     }
});

您可以看到,现在我们必须单独添加每个帖子到RecyclerView,这将给我们提示,也许我们应该使用ChildEventListener.

所以现在当我们使用ChildEventListener时,问题是一样的 – 我们必须将每个帖子分别添加到RecyclerView中,但是当有人更改帖子内容时,firebase只会发送给我们这个帖子,这意味着通过网络减少数据.

我们不喜欢单独添加post RecyclerView,因为例如:
– 很难添加加载指示器,因为我们不知道所有数据何时出现.
– 用户不断刷新视图,而新帖子而不是整个列表变得可见.
– 很难对该集合进行排序,我们必须在适配器中执行此操作.

使用firebase收集的最佳做法是什么,也可能比上面写的更好的解决方案?

编辑

数据方案将如下所示:

"posts" : {
    "123456" : {
      "createdAt" : 1478696885622,"content" : "This is post content","title" : "This is post title","userId" : "abc"
    },"789012" : {
      "createdAt" : 1478696885622,"content" : "This is post content 2","title" : "This is post title 2","userId" : "efg"
    }
  }
  "users" : {
    "abc" : {
      "name" : "username1"
    },"efg" : {
      "name" : "username2"
    }
  }

编辑2

我犯了一个错误 – >当事情发生变化时,Firebase不会在ValueEventListener中获取整个数据.它只得到“三角洲”,here是证明.

解决方法

这个问题有几个问题(即性能,进度指标,处理新数据,如排序).当然,你应该提出一个考虑到你的要求的优先级的解决方案. IMO的ValueEventListener和ChildEventListener都有它们的用例:

> ChildEventListener通常是同步对象列表的推荐方式.这甚至在documentation on working with lists中提到:

When working with lists,your application should listen for child events rather than the value events used for single objects.

这是因为您的客户端仅接收具有特定更新(添加或删除)的已更改子项,而不是每次更新时的整个列表.因此,它允许更精细地处理列表的更新.
> ValueEventListener可以更有用,当您需要处理整个列表修改一个孩子.当您必须对RecyclerView中的列表进行排序时,就是这种情况.通过获取整个列表,对其进行排序并刷新视图的数据集,这样做更容易.另一方面,使用ChildEventListener,更难进行排序,因为只能在每个更新事件的列表中访问一个特定的子节点.

从性能的角度来看,鉴于即使ValueEventListener在同步更新时也意识到“增量”,所以我认为它在客户端方面效率较低,因为客户端必须对整个列表,但这还远远优于网络方面的低效率.

关于持续刷新和进度指标,最重要的是要注意的是,Firebase数据库是一个实时数据库,因此实时数据的不断提供是固有的特征.如果不需要更新事件,您只需使用addListenerForSingleValueEvent方法只读取一次数据.如果要在加载第一个快照时显示进度指示器,也可以使用此选项:

// show progress indicator
postsReference.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        // load initial data set
        // hide progress indicator when done loading
    }

    ...
});

java – ValueEventListener对于在Android中的RecyclerView的ChildEventListener的更多相关文章

  1. android – AnimateLayoutChanges不适用于RecyclerView

    XMLJAVA解决方法过了一会儿我得到了解决方案.我创建了一个函数来设置recyclelerView高度的动画.JAVA}

  2. android – 在RecyclerView中更新ProgressBar

    我有一个RecyclerView.其中,项目具有标准布局–一个TextView和一个ProgressBar.项目在运行时添加到recyclerview.每当添加一个Item时,都会启动一个更新ProgressBar的AsyncTask.AsynTask保存了RecyclerViewAdapter对ProgressBar对象的引用.当回收器视图中的项目太多时,会发生此问题.我知道RecyclerVi

  3. android – WearableRecyclerView .scrollToPosition不适合穿?

    我有一组应该在列表中填充的项目,因为我使用了WearableRecyclerView.在某些情况下,我希望特定的项目成为焦点以供选择.我正在使用Wearablelinearlayoutmanager的scrollToPosition()方法,但监视列表不会滚动到所需的位置,但是在使用RecyclerView和scrollLooutManager的scrollToPosition()的手机上也是如此

  4. android – 在RecyclerView中更改单个drawable的颜色将更改所有drawable

    我只是试图根据一个值改变我的行内部drawable的颜色,但是不是一个drawable,适配器改变了所有这些颜色.这是我的适配器:知道怎么做?谢谢您的帮助!!!

  5. android – 我可以像这样创建一个nestedScroll布局吗?

    我认为它可以通过nestedScrollingChildnestedScrollingParent来实现.但我无法理解他们.谁可以帮助我!产品经理坚持设计.ScrollView包含LinearLayout,“TabLayout”和ViewPager.ViewPager包含2个包含RecyclerView的片段或仅包含2个RecyclerView.当ScrollView滚动到Bottom时,Recy

  6. android – 在NestedScrollView onBindViewHolder中的RecyclerView调用所有getItemCount大小

    当我将RecyclerView放入nestedScrollView时,然后onBindViewHolder调用所有行,比如说我有一个大小为30的列表,那么即使没有滚动,也会同时为所有30行调用onBindViewHolder我的xml是但如果我删除nestedScrollView它正常工作.解决方法高度问题引起的问题.1)编辑nestedScrollView&RecyclerView如下:2)确保

  7. android – RecyclerView滚动条在第一个项目后跳回到顶部

    我创建了一个非常基本的RecyclerView示例.布局:活动:现在,当我滚动到第一个项目之外时,滚动条会跳回到顶部然后继续正常.第二个问题是当我滚动到底部时,滚动条会提前停止.这是支持库中的错误还是我自己的错?解决方法如here所述,此错误已在新版本的支持库v21.0.2中得到修复.

  8. android – 将项目添加到recyclerview的顶部

    我的活动中有一个Recyclerview.当我下拉它将加载新项目回收视图.现在我需要实现pull来将概念刷新到我的recyclerview.我做到了.但是当我调用pull来刷新时,我正在获取新项目并添加到回收视图底部.我需要在循环视图的顶部添加新项目.如何将新加载的项目添加到回收站视图的顶部位置.解决方法我会坚持要在第0个位置添加项目,这个位置来自拉动刷新,如下所示,

  9. android – 如何在另一个recycleview适配器下的recycleview适配器?

    我有一个RecyclerView.它有一个自定义布局,在自定义布局内是另一个RecyclerView.当我通知回收站视图项目已被删除时,我的主回收站视图已更新,但我的自定义视图回收视图未收到通知.这是要删除的RecyclerView滑动的代码.在我的购物车适配器中我采取了另一个回收视图适应.任何想法如何通知自适应如果从循环视图中删除任何数据.???我的onBindViewHolder类家长回收视图儿童recycleview解决方法首先,为什么你甚至需要另一个回收者视图?

  10. android – Animate Recycler在列数更改时查看网格

    我正在使用带有GridLayoutManager的RecyclerView.用户可以在2到4之间切换跨度计数,这将导致动画将每个单元格的内置翻译动画运行到其新位置.我到目前为止使用的代码是:这对我来说一直很好,但现在我需要为每个跨度计数设置不同的布局.为了支持这一点,我在RecyclerView中有2种视图类型,并且由于在移动到新的跨度计数时视图类型已更改,因此RecyclerView无法看到它是

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部