firebase在滚动(Android)上加载更多物品



我正在尝试制作聊天应用程序,我将firebase用作后端,我正在填充我的listView oncreate(),最后10条消息,我只希望当用户滚动 ^时,每次都会再加载10个。

我一切正常,问题是firebase每次加载 able 数据,而不是增加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) {
        }
    });
}

我认为您可以使用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

您可以使用startat(),endat()和quareTo()方法。当用户到达列表的结尾时,请调用一种方法以从服务器加载更多。确保实现ValueEventListener。

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

最新更新