Firebase android pagination

后端 未结 10 1506
天命终不由人
天命终不由人 2020-11-28 09:14

I\'m building an app which will show videos stored on firebase. The list of videos needs to be paginated fetching most recent 20 videos at a time.

Here is

10条回答
  •  抹茶落季
    2020-11-28 09:22

    accepted answear dos not work when less then the max. itmes (21) in database. this is my solution build on the accepted answer:

    0)set variables

            private String lastMessageKey;
        private int totalItemCount;
        private int lastVisibleItem;
        private boolean isLoadingMoreFollowers = false;
        private boolean hasMoreItems = true;
        private boolean hasShownNoMoreItemsToast = false;
        private boolean initialLoad = true;
        private final int MAX_LOAD_ITEMS = 11;
        private final int VISIBLE_TRESHOLD = 1;
    

    1) set a listener:

           private void setMessageListener() {
    
            if (childEventListener == null) {
    
                mmessageArrayList.clear();
                final ArrayList tempMmessages = new ArrayList<>();
                query = mDatabaseInstace.getReference().child(chat1).child(F.CHATS).child(F.MESSAGES).orderByKey().limitToLast(MAX_LOAD_ITEMS-1);
                childEventListener = new ChildEventListener() {
                    @Override
                    public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                        Log.d(TAG, "onChildAdded: -----------------> " + dataSnapshot);
                        Log.d(TAG, "onChildAdded: -----------------> " + s);
    
                        tempMmessages.add(dataSnapshot.getValue(Mmessage.class));
                        preloadMessagePics(tempMmessages);
                        if (initialLoad) {
                            lastMessageKey = tempMmessages.get(0).getMessagePushKey();
                            initialLoad = false;
                        }
                        mmessageArrayList.add(tempMmessages.size()-1, tempMmessages.get(0));
                        messageAdapter.notifyDataSetChanged();
                        tempMmessages.clear();
    
    
                    }
    
                    @Override
                    public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                        Log.d(TAG, "onChildChanged: --------------------------------->");
    
                    }
    
                    @Override
                    public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
                        Log.d(TAG, "onChildRemoved: ---------------------------------->");
    
                    }
    
                    @Override
                    public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                        Log.d(TAG, "onChildMoved: ------------------------------------>");
    
                    }
    
                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {
                        Log.d(TAG, "onCancelled: ------------------------------------->");
    
                    }
                };
                query.addChildEventListener(childEventListener);
            }
    
        }
    

    2) set load more listener:

            private void setLoadMoreListener(){
            setup.RV_messages.addOnScrollListener(new RecyclerView.OnScrollListener() {
                @Override
                public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                    super.onScrolled(recyclerView, dx, dy);
    
    
                    totalItemCount = linearLayoutManager.getItemCount();
                    lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();
    
    
    
                    if (!isLoadingMoreFollowers && totalItemCount <= (lastVisibleItem+VISIBLE_TRESHOLD) && (totalItemCount >= MAX_LOAD_ITEMS-1)){
    
                        if (hasMoreItems) {
    
                            getMoreMessages();
                            Toast.makeText(homeActivity, "load more items", Toast.LENGTH_SHORT).show();
    
                        }else {
                            if (!hasShownNoMoreItemsToast) {
                                Toast.makeText(homeActivity, "has no more items", Toast.LENGTH_SHORT).show();
                                hasShownNoMoreItemsToast = true;
                            }
                        }
    
                    }
    
                }
            });
        }
    

    3) get more items:

           private void getMoreMessages(){
    
            final ArrayList tempMmessages = new ArrayList<>();
    
            isLoadingMoreFollowers = true;
            loadMoreQuery = mDatabaseInstace.getReference().child(chat1).child(F.CHATS).child(F.MESSAGES).orderByKey().endAt(lastMessageKey).limitToLast(MAX_LOAD_ITEMS);
            loadMoreChildEventListener = new ChildEventListener() {
                @Override
                public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
    
                    tempMmessages.add(dataSnapshot.getValue(Mmessage.class));
                    preloadMessagePics(tempMmessages);
    
                    if (tempMmessages.size() == MAX_LOAD_ITEMS){
    
                        lastMessageKey = tempMmessages.get(0).getMessagePushKey();
                        Collections.reverse(tempMmessages);
                        tempMmessages.remove(0);
                        mmessageArrayList.addAll(tempMmessages);
                        isLoadingMoreFollowers = false;
                        messageAdapter.notifyDataSetChanged();
                        tempMmessages.clear();
                        return;
                    }
    
    
                    if (lastMessageKey.equalsIgnoreCase(tempMmessages.get(tempMmessages.size()-1).getMessagePushKey())){
    
                        Collections.reverse(tempMmessages);
                        tempMmessages.remove(0);
                        mmessageArrayList.addAll(tempMmessages);
                        isLoadingMoreFollowers = false;
                        hasMoreItems = false;
                        messageAdapter.notifyDataSetChanged();
                        tempMmessages.clear();
    
                    }
    
                }
    
                @Override
                public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
    
                }
    
                @Override
                public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
    
                }
    
                @Override
                public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
    
                }
    
                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
    
                }
            };
            loadMoreQuery.addChildEventListener(loadMoreChildEventListener);
    
        }
    

    have fun!!

提交回复
热议问题