Firebase 数据库分页滚动动作

Posted

技术标签:

【中文标题】Firebase 数据库分页滚动动作【英文标题】:Firebase database pagination scrolling action 【发布时间】:2019-01-25 05:54:52 【问题描述】:

我正在学习教程: https://codelabs.developers.google.com/codelabs/firebase-android/#6

我试图实现分页,这是我修改的内容:

...
Query query = databaseRef.limitToLast(50);
...
FirebaseRecyclerOptions<FriendlyMessage> options =
            new FirebaseRecyclerOptions.Builder<FriendlyMessage>()
                    .setQuery(query, parser)
                    .build();
...

这是默认滚动代码作为教程:

mFirebaseAdapter.registerAdapterDataObserver(new 
RecyclerView.AdapterDataObserver() 
   @Override
   public void onItemRangeInserted(int positionStart, int itemCount) 
       super.onItemRangeInserted(positionStart, itemCount);
       int friendlyMessageCount = mFirebaseAdapter.getItemCount();
       int lastVisiblePosition =
              mLinearLayoutManager.findLastCompletelyVisibleItemPosition();
       // If the recycler view is initially being loaded or the 
       // user is at the bottom of the list, scroll to the bottom 
       // of the list to show the newly added message.
       if (lastVisiblePosition == -1 ||
               (positionStart >= (friendlyMessageCount - 1) &&
                       lastVisiblePosition == (positionStart - 1))) 
           mMessageRecyclerView.scrollToPosition(positionStart);
       
   
);

mMessageRecyclerView.setAdapter(mFirebaseAdapter);

现在屏幕只显示 50 条消息。

但是当有新消息到来时它不会滚动到底部。在使用查询之前它工作正常。

我想知道我应该从哪里开始修改。

谢谢。

【问题讨论】:

Here 使用startAt(oldestPostId) 刷新时从lastItem 开始。或者,一个完整的解决方案:***.com/questions/44777989/… @ʍѳђઽ૯ท 感谢您的评论,我已经编辑了这个问题。我刚刚发现在实现向上滚动操作之前我需要处理这个问题。 This 是一种推荐的方式,您可以通过将查询游标与 limit() 方法相结合来对查询进行分页。我还建议您看看这个 video 以便更好地理解。 【参考方案1】:

从快速方面:

通过改变startKey,我们可以从我们想要的地方(从数据库末尾)查询数据,并通过滚动到屏幕顶部来实现分页。

if (startKey == nil)
        print("firebasetest_startkey: ",self.startKey)
        // for first grabbing data operation

        _refHandle = self.ref.child(channel_title).queryOrderedByKey().queryLimited(toLast: 30).observe(.value)(snapshot) in
            guard let children = snapshot.children.allObjects.first as? DataSnapshot elsereturn
            if (snapshot.childrenCount > 0)
                for child in snapshot.children.allObjects as! [DataSnapshot]
                    if(!(self.messageKeys.contains((child as AnyObject).key)))
                        self.messages.append(child)
                        self.messageKeys.append(child.key)
                        self.itemTable.insertRows(at: [IndexPath(row: self.messages.count-1, section: 0)], with: .automatic)
                    
                
                self.startKey = children.key
            
        
    else if (dragdirection == 0 && startKey != nil)
        //going up
        // for all other grabbing data operation from the bottom of the database

        _refHandle = self.ref.child(channel_title).queryOrderedByKey().queryEnding(atValue: self.startKey).queryLimited(toLast: 10).observe(.value)(snapshot) in
            guard let children = snapshot.children.allObjects.first as? DataSnapshot elsereturn
            if (snapshot.childrenCount > 0 )
                for child in snapshot.children.reversed()
                    if ((child as AnyObject).key != self.startKey &&
                        !(self.messageKeys.contains((child as AnyObject).key)))
                        self.messages.insert(child as! DataSnapshot, at:0)
                        self.messageKeys.append((child as AnyObject).key)
                        self.itemTable.insertRows(at: [IndexPath(row: 0, section: 0)], with: .fade)
                    
                
                self.startKey = children.key
            
        
    

【讨论】:

以上是关于Firebase 数据库分页滚动动作的主要内容,如果未能解决你的问题,请参考以下文章

使用 Firebase Firestore 进行分页 - swift 4

如何使用 StaggeredGridLayoutManager 在 recyclerview 中实现无限滚动(分页)

Firebase Javascript:按降序对帖子进行分页

Vue滚动底部分页实现

新的分页库也可以与 Firebase 一起使用?

前端滚动加载后端如何分页