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 中实现无限滚动(分页)