【问题标题】:Firebase to load more items on scroll (Android)Firebase 在滚动上加载更多项目(Android)
【发布时间】:2017-05-06 15:01:30
【问题描述】:

我正在尝试制作一个聊天应用程序,我使用 Firebase 作为我的后端, 我正在用发送的最后 10 条消息填充我的列表视图 onCreate(), 我只希望当用户向上滚动时 ^ 每次都会多加载 10 个。

我开始工作了,问题是 Firebase 每次都加载所有数据,而不是增加 10 现有数据。

例如:它在启动时加载 10 条消息,当我向上滚动时它加载 20 条消息,然后它加载 30 条消息,而不是一次仅加载 10 条。

这是代码:

//Listview to find when user is scrolling and reach the top i.e firstVisibleItem == 0

messagesList.setOnScrollListener(new AbsListView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(AbsListView absListView, int i) {

    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem,
        int visibleItemCount, int totalItemCount) {

        if (firstVisibleItem == 0 && !loading) {
            msgNum += 10;
            setMessagesList(msgNum); //your load more function
        }
    }
});

//Firebase to load more on scroll code:
public void setMessagesList(int msgNum) {

    MessegesRef2 = database.getReference("chatsMessages").child(chatID);
    messageValueListener = MessegesRef2.orderByChild("creationDate").limitToLast(msgNum).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            loading = true;
            for (DataSnapshot data: dataSnapshot.getChildren()) {

                ChatMessage chatMessage = data.getValue(ChatMessage.class);

                chatMessageAdapter.add(chatMessage);
                chatMessageAdapter.notifyDataSetChanged();
            }
            loading = false;
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

【问题讨论】:

  • 每当列表滚动时,您都在创建消息引用。这就是您的应用程序获取所有数据的原因。
  • 嘿Febi,是的,我知道。因此,我在问如何使用 Firebase 来完成?
  • 您只需在列表滚动上更新您的查询,而不是一次又一次地创建引用。

标签: android listview firebase firebase-realtime-database


【解决方案1】:

我觉得你可以用endAt()

ref.orderByChild("creationDate").limitToLast(pageSize).endAt(oldestLocalMessageTime).addValueEventListener
// pageSize is the number of messages you want to load each time (10)
// oldestLocalMessageTime is the time of oldest message that you have loaded from Firebase
// everytime you load/load more messages you need to update oldestLocalMessageTime value

【讨论】:

【解决方案2】:

您可以使用 startAt()、endAt() 和 equalTo() 方法。当用户到达列表末尾时,调用一个方法从服务器加载更多。确保实现 ValueEventListener。

Query pagination = mDatabase.orderByChild("id").startAt(startAt).endAt(startAt + 10);
pagination.addListenerForSingleValueEvent(this);

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
相关资源
最近更新 更多