title: How to load batches of data in a recycler view using firestore?
body: <p>I wanted to know how to load more data in recylcer view using firestore.</p>
  
  <pre><code> Query query = FirebaseFirestore.getInstance()
              .collection("ie").limit(5);  
  adapter=new InterviewAdapter(this,query);    
  recyclerView.setAdapter(adapter);
  recyclerView.setLayoutManager(new LinearLayoutManager(this));
  </code></pre>
  
  <p>Adapter class looks like this:</p>
  
  <pre><code>public class InterviewAdapter extends FireStoreAdapter&lt;InterviewAdapter.ViewHolder&gt; {
  
  public interface OnInterviewSelectedListener {
  
      void onInterviewSelected(DocumentSnapshot interview);
  
  }
  
  private InterviewAdapter.OnInterviewSelectedListener mListener;
  
  public InterviewAdapter(Query query, OnInterviewSelectedListener listener) {
      super(query);
      mListener = listener;
  }
  
  @Override
  public InterviewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
      LayoutInflater inflater = LayoutInflater.from(parent.getContext());
      return new InterviewAdapter.ViewHolder(inflater.inflate(R.layout.ie, parent, false));
  }
  
  @Override
  public void onBindViewHolder(InterviewAdapter.ViewHolder holder, int position) {
      holder.bind(getSnapshot(position), mListener);
  }
  
  static class ViewHolder extends RecyclerView.ViewHolder {
  
      TextView title,companyName,username,views,isHired;
  
      public ViewHolder(View itemView) {
          super(itemView);
          title= (TextView) itemView.findViewById(R.id.title);
          companyName= (TextView) itemView.findViewById(R.id.companyName);
          username= (TextView) itemView.findViewById(R.id.username);
          views= (TextView) itemView.findViewById(R.id.views);
          isHired= (TextView) itemView.findViewById(R.id.isHired);
      }
  
      public void bind(final DocumentSnapshot snapshot,
                       final OnInterviewSelectedListener listener) {
  
  
          InterviewExperience experience;
          String companyName=snapshot.getString("companyName");
          boolean isHired=Boolean.valueOf(snapshot.getBoolean("isHired"));
          String username=snapshot.getString("username");
          long views=new Double(Double.valueOf(snapshot.getDouble("views"))).longValue();
  
          String id=snapshot.getId();
  
  
          String title=snapshot.getString("title");
          experience=new InterviewExperience(id,title,companyName,username,isHired,views,null,null);
  
  
          this.title.setText(experience.getTitle());
          this.companyName.setText("Company Name: "+experience.getCompanyName());
          this.isHired.setText("Hired: "+experience.isHired());
          this.views.setText("Views: "+experience.getViews()+"");
          this.username.setText("Created By: "+experience.getUsername());
  
  
  
          // Click listener
          itemView.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View view) {
                  if (listener != null) {
                      listener.onInterviewSelected(snapshot);
                  }
              }
          });
      }
  
  }
  }
  
  public abstract class FireStoreAdapter&lt;VH extends RecyclerView.ViewHolder&gt;
      extends RecyclerView.Adapter&lt;VH&gt;
      implements EventListener&lt;QuerySnapshot&gt; {
  
  private static final String TAG = "FirestoreAdapter";
  
  private Query mQuery;
  private ListenerRegistration mRegistration;
  
  private ArrayList&lt;DocumentSnapshot&gt; mSnapshots = new ArrayList&lt;&gt;();
  
  public FireStoreAdapter(Query query) {
      mQuery = query;
  }
  
  @Override
  public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) {
      if (e != null) {
          Log.w(TAG, "onEvent:error", e);
          onError(e);
          return;
      }
  
      // Dispatch the event
      Log.d(TAG, "onEvent:numChanges:" + documentSnapshots.getDocumentChanges().size());
      for (DocumentChange change : documentSnapshots.getDocumentChanges()) {
          switch (change.getType()) {
              case ADDED:
                  onDocumentAdded(change);
                  break;
              case MODIFIED:
                  onDocumentModified(change);
                  break;
              case REMOVED:
                  onDocumentRemoved(change);
                  break;
          }
      }
  
      onDataChanged();
  }
  
  public void startListening() {
      if (mQuery != null &amp;&amp; mRegistration == null) {
          mRegistration = mQuery.addSnapshotListener(this);
      }
  }
  
  public void stopListening() {
      if (mRegistration != null) {
          mRegistration.remove();
          mRegistration = null;
      }
  
      mSnapshots.clear();
      notifyDataSetChanged();
  }
  
  public void setQuery(Query query) {
      // Stop listening
      stopListening();
  
      // Clear existing data
      mSnapshots.clear();
      notifyDataSetChanged();
  
      // Listen to new query
      mQuery = query;
      startListening();
  }
  
  @Override
  public int getItemCount() {
      return mSnapshots.size();
  }
  
  protected DocumentSnapshot getSnapshot(int index) {
      return mSnapshots.get(index);
  }
  
  protected void onDocumentAdded(DocumentChange change) {
      mSnapshots.add(change.getNewIndex(), change.getDocument());
      notifyItemInserted(change.getNewIndex());
  }
  
  protected void onDocumentModified(DocumentChange change) {
      if (change.getOldIndex() == change.getNewIndex()) {
          // Item changed but remained in same position
          mSnapshots.set(change.getOldIndex(), change.getDocument());
          notifyItemChanged(change.getOldIndex());
      } else {
          // Item changed and changed position
          mSnapshots.remove(change.getOldIndex());
          mSnapshots.add(change.getNewIndex(), change.getDocument());
          notifyItemMoved(change.getOldIndex(), change.getNewIndex());
      }
  }
  
  protected void onDocumentRemoved(DocumentChange change) {
      mSnapshots.remove(change.getOldIndex());
      notifyItemRemoved(change.getOldIndex());
  }
  
  protected void onError(FirebaseFirestoreException e) {};
  
  protected void onDataChanged() {}
  }
  </code></pre>
  
  <p>I used Firestore Adapter code which was given in samples of firestore documentation. Can anyone tell how to use the query object to load more data?</p>
  
  <p>How to load the next 5 items in the recycler view when users scrolls to the end of the list?</p>