【问题标题】:Firebase pagination limitToFirst() vs limitToLast()Firebase 分页 limitToFirst() 与 limitToLast()
【发布时间】:2017-06-28 19:56:26
【问题描述】:

我正在尝试在 android 中实现 Firebase,对此我有一些疑问,如果您能帮助我解决这个问题,我会很高兴。对此感到有些困惑。所以这是我的问题。

我在 listview 中显示 Firebase 聊天,其中我只想从 firebase 加载第 100 条消息,之后用户将执行 pull-to-refresh 然后加载第 200 条消息等等。

为此,我正在查看 limitToFirst()limitToLast() 不知道哪个更好。

谁能帮忙。

【问题讨论】:

  • @Frank van Puffelen 我想得到你的答案,这对我来说真的很宝贵。
  • @Maveň 感谢您的赏金,我现在得到了正确的答案。

标签: android firebase pagination firebase-realtime-database


【解决方案1】:

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

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

private Query queryChat;

onStart方法中,开始查询:

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

    // initialize your value event listener

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

}

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

这样做,您首先对您的消息进行升序(因此,结果排序列表中的第一条消息是最旧的),然后您选择最后的pageSize 消息(所以,@ 987654329@ 按时间顺序排在最后)。因此,您将收到第一条(按时间顺序,从最新开始)pageSize 消息。

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

现在,像这样在你的类中定义一个方法:

private void loadMoreItems() {

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

这里的messageList 是一个存储聊天消息的 ArrayList,当您从 firebase 获取消息时,它会填充在 ValueEventListener 中。

在这里,我告诉 firebase 执行升序(和以前一样),但只选择那些时间戳 .endAt(messageList.get(messageList.size()-1).getTimestamp()) 正是告诉 firebase 这个) ,最后像以前一样limitToLast

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

【讨论】:

  • 感谢您的回答,我想加载最新的 100 条消息,然后如果用户拉动以刷新加载 200 条最新消息等等,哪一个最适合这种情况。
  • 您所说的“哪个最适合这种情况”是什么意思?
  • @Valentino 我想知道在我的情况下使用哪一个?
  • 这取决于您如何订购 orderByChild。正如您在这个答案中看到的那样,将 limitToLast 与 orderByChild 和 endAt 结合使用非常简单
  • 嗨,@valentinoS。我试图按照你的方法,但我总是得到相同的项目......我已经在一个新线程中输入了我的问题。你很高兴来帮助我。 stackoverflow.com/questions/45997375/…
【解决方案2】:

你可以试试这个方法:

int mPageEndOffset = 0;
int mPageLimit = 10;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    connectDetector = new ConnectDetector(getActivity());
    if(connectDetector.getConnection()) {

        alanRef = new Firebase(firebaseURL).child(EventChatActivity.SuperCateName + "/ " + eventDetail.getCategory_name() + "/ " + eventDetail.getEvent_title() + "/ " + EventChatActivity.eventID).child("StadiumChat");
        alanQuery = alanRef.limitToFirst(mPageLimit);
        userName = MyApp.preferences.getString(MyApp.USER_NAME, null);

        EventChatActivity.eventID).child("StadiumChat");
    }
}    

这将从 firebase 获取最新 10 条消息的记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 2018-06-28
    • 2020-04-08
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多