This is how I applied pagination from the firebase database. Consider the case if we have 100 posts. Therefore, I first load the last 20 messages from firebase, that is, from 81 to 100. Then, when scrolling up, I call the getMoreMessages() function to load the next 20 messages, which are from 61 to 80, etc.
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<MessageModel> messageArrayList = new ArrayList<>(); private ArrayList<MessageModel> 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(); } }
KishanSolanki124
source share