Firebase 分页 limitToFirst() 与 limitToLast()

Mav*_*eňツ 0 pagination android firebase firebase-realtime-database

我正在尝试在 android 中实现 Firebase,对此我有一些疑问,如果您能帮助我,我将很高兴。陷入其中有点困惑。这是我的问题。

我正在显示 Firebase 聊天,listview其中我只想从 Firebase 加载第一条 100 条消息,然后用户将pull-to-refresh加载第一条 200 条消息,依此类推。

在此输入图像描述

为此,我正在寻找limitToFirst()limitToLast()不知道哪一个更好。

任何人都可以帮忙吗?

Val*_* S. 5

我以这种方式做了几乎同样的事情:

在您的类(我假设是一个 Activity)中,创建一个Query类型的成员变量:

private Query queryChat;
Run Code Online (Sandbox Code Playgroud)

在该onStart方法中,开始执行查询:

@Override
public void onStart() {
    super.onStart();

    // initialize your value event listener

    queryChat= mFirebaseDatabaseReference.
            .orderByChild("timestamp")
            .limitToLast(pageSize);
    queryChat.addListenerForSingleValueEvent(yourValueEventListener);

}
Run Code Online (Sandbox Code Playgroud)

pageSize是一个int变量,这里必须设置为100。

通过这种方式,您首先对消息进行升序排列(因此,结果排序列表中的第一条消息是最旧的),然后选择最后一条消息pageSize(因此,pageSize按时间顺序排列的最后一条消息)。因此,您将收到第一条(按时间顺序,从最新的开始)pageSize消息。

我想你已经在ValueEventListener这里实现了。另外,timestamp是 firebase 消息中的一个字段,您在其中存储消息的时间戳(以毫秒为单位)。

现在,在您的类中定义一个方法,如下所示:

private void loadMoreItems() {

    queryChat= mFirebaseDatabaseReference.
            .orderByChild("timestamp")
            .endAt(messageList.get(messageList.size()-1).getTimestamp())
            .limitToLast(pageSize);
    queryChat.addListenerForSingleValueEvent(yourValueEventListener);
}
Run Code Online (Sandbox Code Playgroud)

这里messageList是一个 ArrayList,用于存储聊天消息,当您从 firebase 获取消息时,该 ArrayList 会填充到 ValueEventListener 中。

在这里,我告诉 firebase 执行升序(像以前一样),但只选择时间戳 <= 用户已经可见的最后一个项目的那些项目。(.endAt(messageList.get(messageList.size()-1).getTimestamp())告诉 firebase 正是这一点),最后limitToLast像以前一样。

现在,您可以loadMoreItems随时调用此方法( )(在您的情况下,当用户拉动刷新时)。