Firebase android pagination

后端 未结 10 1507
天命终不由人
天命终不由人 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:35

    This is how I implemented pagination from firebase database. Consider a case if we have 100 messages. So I first load last 20 messages from firebase i.e. 81 to 100. Then on scroll up I call getMoreMessages() function to load next 20 messages which are 61 to 80 and so on.

    public class ChatActivity extends Activity {
    
            String chat_id = "";
            long mTotalChildren = 0;
            boolean loading = false;
            ChildEventListener childEventListenerMain, childEventListenerPager;
            ChatActivity mContext = ChatActivity.this;
            MessageAdapter messageAdapter;
            @BindView(R.id.pb_messages)
            ProgressBar pb_messages;
            @BindView(R.id.ll_audio)
            LinearLayout llAudio;
            @BindView(R.id.tv_record_time)
            AppCompatTextView tvRecordTime;
            @BindView(R.id.tv_cancel)
            AppCompatTextView tvCancel;
            @BindView(R.id.iv_send)
            AppCompatImageView ivSend;
            @BindView(R.id.iv_record)
            AppCompatImageView ivRecord;
            @BindView(R.id.ab_layout)
            AppBarLayout abLayout;
            @BindView(R.id.messages)
            RecyclerView rvMessages;
            @BindView(R.id.iv_chat_icon)
            SimpleDraweeView ivChatIcon;
            @BindView(R.id.iv_camera)
            AppCompatImageView ivCamera;
            @BindView(R.id.iv_gallery)
            AppCompatImageView ivGallery;
            @BindView(R.id.message_input)
            AppCompatEditText messageInput;
            @BindView(R.id.tv_send)
            AppCompatTextView tvSend;
            @BindView(R.id.toolbar_title)
            AppCompatTextView toolbarTitle;
            @BindView(R.id.toolbar_status)
            AppCompatTextView toolbarStatus;
            @BindView(R.id.ll_send)
            LinearLayout llSend;
            int categoryId, senderId, receiverId, offerId;
            String mLastKey;
            LinearLayoutManager layoutManager;
            private ArrayList messageArrayList = new ArrayList<>();
            private ArrayList tempMessageArrayList = new ArrayList<>();
    
            @Override
            public int getLayoutId() {
                return R.layout.activity_chat;
            }
    
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
    
                messageAdapter = new MessageAdapter(mContext, messageArrayList) {
    
                };
    
                layoutManager = new LinearLayoutManager(mContext);
    
                rvMessages.setLayoutManager(layoutManager);
                rvMessages.setItemAnimator(new DefaultItemAnimator());
                rvMessages.setAdapter(messageAdapter);
                rvMessages.setHasFixedSize(true);
    
                rvMessages.addOnScrollListener(new RecyclerView.OnScrollListener() {
                    @Override
                    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                        super.onScrollStateChanged(recyclerView, newState);
                    }
    
                    @Override
                    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                        super.onScrolled(recyclerView, dx, dy);
    
                        if (messageArrayList.size() >= 20 &&
                                !loading && layoutManager.findFirstVisibleItemPosition() == 0 && messageArrayList.size() < mTotalChildren) {
    
                            loading = true;
                            getMoreMessages();
                        }
                    }
                });
    
                messageAdapter.notifyDataSetChanged();
    
                //used to scroll up recyclerview when keyboard pops up
                rvMessages.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
                    @Override
                    public void onLayoutChange(View view, int left, int top, int right, int bottom,
                                               int oldLeft, int oldTop, int oldRight, int oldBottom) {
                        if (bottom < oldBottom) {
                            rvMessages.postDelayed(new Runnable() {
                                @Override
                                public void run() {
                                    rvMessages.scrollToPosition(messageArrayList.size() - 1);
                                }
                            }, 100);
                        }
                    }
                });
    
                loading = true;
                getMessages();
            }
    
            public void getMessages() {
    
                FirebaseDatabase.getInstance().getReference().child(pathtomsgs).addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        Log.e("childrenCount", String.valueOf(+dataSnapshot.getChildrenCount()));
                        mTotalChildren = dataSnapshot.getChildrenCount();
                    }
    
                    @Override
                    public void onCancelled(DatabaseError databaseError) {
    
                    }
                });
    
    
                Query messageQuery = FirebaseDatabase.getInstance().getReference().child(pathtomsgs).limitToLast(20);
    
                childEventListenerMain = new ChildEventListener() {
                    @Override
                    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
    
                        loading = true;
                        MessageModel messageModel = dataSnapshot.getValue(MessageModel.class);
                        if (messageModel != null) {
                            messageModel.chat_id = chat_id;
                            messageModel.message_id = dataSnapshot.getKey();
                            messageArrayList.add(messageModel);
                            messageAdapter.notifyDataSetChanged();
                            mLastKey = messageArrayList.get(0).message_id;
                            rvMessages.scrollToPosition(messageArrayList.size() - 1);
                        }
                    }
    
                    @Override
                    public void onChildChanged(DataSnapshot dataSnapshot, String s) {
    
                    }
    
                    @Override
                    public void onChildRemoved(DataSnapshot dataSnapshot) {
    
                    }
    
                    @Override
                    public void onChildMoved(DataSnapshot dataSnapshot, String s) {
    
                    }
    
                    @Override
                    public void onCancelled(DatabaseError databaseError) {
                        Toast.makeText(mContext, "Problem loading more images...", Toast.LENGTH_LONG).show();
                    }
                };
    
                messageQuery.addChildEventListener(childEventListenerMain);
    
                ValueEventListener messageChildSINGLEValueEventListener = new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        pb_messages.setVisibility(View.GONE);
                        System.out.println("We're done loading messages " + dataSnapshot.getChildrenCount() + " items");
                        loading = false;
                    }
    
                    @Override
                    public void onCancelled(DatabaseError databaseError) {
    
                    }
                };
    
                messageQuery.addListenerForSingleValueEvent(messageChildSINGLEValueEventListener);
            }
    
            public void getMoreMessages() {
                tempMessageArrayList.clear();
    
                Query messageQuery = FirebaseDatabase.getInstance().getReference().child(pathtomsgs).orderByKey().endAt(mLastKey).limitToLast(20);
    
                childEventListenerPager = new ChildEventListener() {
                    @Override
                    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                        loading = true;
                        MessageModel messageModel = dataSnapshot.getValue(MessageModel.class);
                        if (messageModel != null) {
    
                            messageModel.chat_id = chat_id;
                            messageModel.message_id = dataSnapshot.getKey();
                            tempMessageArrayList.add(messageModel);
                        }
                    }
    
                    @Override
                    public void onChildChanged(DataSnapshot dataSnapshot, String s) {
    
                    }
    
                    @Override
                    public void onChildRemoved(DataSnapshot dataSnapshot) {
    
                    }
    
                    @Override
                    public void onChildMoved(DataSnapshot dataSnapshot, String s) {
    
                    }
    
                    @Override
                    public void onCancelled(DatabaseError databaseError) {
                        Toast.makeText(mContext, "Problem loading more images...", Toast.LENGTH_LONG).show();
                    }
                };
    
                messageQuery.addChildEventListener(childEventListenerPager);
    
                ValueEventListener messageChildSINGLEValueEventListener = new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        System.out.println("We're done loading messages " + dataSnapshot.getChildrenCount() + " items");
    
                        tempMessageArrayList.remove(tempMessageArrayList.size() - 1);
    
                        messageArrayList.addAll(0, tempMessageArrayList);
                        mLastKey = messageArrayList.get(0).message_id;
                        messageAdapter.notifyDataSetChanged();
                        //rvMessages.scrollToPosition(20);
                        layoutManager.scrollToPositionWithOffset(19, 0);
                        loading = false;
                    }
    
                    @Override
                    public void onCancelled(DatabaseError databaseError) {
    
                    }
                };
    
                messageQuery.addListenerForSingleValueEvent(messageChildSINGLEValueEventListener);
            }
    
    
            @Override
            protected void onDestroy() {
    
                FirebaseDatabase.getInstance().getReference().child(pathtomsgs).removeEventListener(childEventListenerPager);
                FirebaseDatabase.getInstance().getReference().child(pathtomsgs).removeEventListener(childEventListenerMain);
    
                super.onDestroy();
            }
        }
    

提交回复
热议问题