0

我想知道如何使用firestore在recylcer視圖中加載更多數據。如何使用firestore在回收站視圖中加載批量數據?

Query query = FirebaseFirestore.getInstance() 
      .collection("ie").limit(5); 
adapter=new InterviewAdapter(this,query);  
recyclerView.setAdapter(adapter); 
recyclerView.setLayoutManager(new LinearLayoutManager(this)); 

適配器類看起來像這樣:

public class InterviewAdapter extends FireStoreAdapter<InterviewAdapter.ViewHolder> { 

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<VH extends RecyclerView.ViewHolder> 
    extends RecyclerView.Adapter<VH> 
    implements EventListener<QuerySnapshot> { 

private static final String TAG = "FirestoreAdapter"; 

private Query mQuery; 
private ListenerRegistration mRegistration; 

private ArrayList<DocumentSnapshot> mSnapshots = new ArrayList<>(); 

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 && 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() {} 
} 

我用其在文檔的FireStore樣品給定公司的FireStore適配器代碼。任何人都可以告訴如何使用查詢對象來加載更多的數據?

如何在用戶滾動到列表末尾時在回收站視圖中加載下一個5項?

回答

0

可以分頁您Query一樣,S方法的使用Query導致'startAt()startAfter()endAt()endBefore()與指定DocumentSnapshot

如果我認爲你的集合被稱爲「面試」,你可以將方法添加到您的FireStoreAdapter這樣的:

private void paginate(final DocumentSnapshot last, final int limit) { 
    final Query subset; 
    if (last == null) { 
     subset = db.collection("interviews") 
       .limit(limit); 
    } else { 
     subset = db.collection("interviews") 
       .startAfter(last) 
       .limit(limit); 
    } 
    setQuery(subset); 
} 

可以持之以恆的最後DocumentSnapshotonEvent()

final List<DocumentChange> changes = documentSnapshots.getDocumentChanges(); 
final DocumentSnapshot lastDocument = changes.get(changes.size() - 1).getDocument(); 

最後,當用戶滾動到列表的末尾時:

paginate(lastDocument, 5); 

onDocumentAdded()會照顧它。請小心不要使用startAt(),因爲它不會執行最後一個(已經在您的列表的末尾,並將複製它)。

相關問題