0

firestoreを使って、より多くのデータをレシラービューに読み込む方法を知りたかったのです。私はfirestoreドキュメントのサンプルに与えられたFirestoreアダプタのコードを使用Firestoreを使用してリサイクラービューにデータのバッチをロードする方法は?

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

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

アダプタクラスは次のようになります。クエリオブジェクトを使用してより多くのデータをロードする方法を教えてもらえますか?ユーザーがスクロールリストの最後にリサイクル・ビューに次の5つの項目をロードする方法

?あなたのQueryページ付けすることができます

答えて

0

startAt()、同様の方法、startAfter()endAt()、指定されたDocumentSnapshotendBefore()年代はQueryを使用して結果 'は。

私はあなたのコレクションは "インタビュー" と呼ばれていると考えた場合、あなたはこのようなあなたのFireStoreAdapterにメソッドを追加することができます。最後に

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

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()内をperserveすることができます、ときに、ユーザーがスクロールリストの最後に:

paginate(lastDocument, 5); 

そしてonDocumentAdded()が世話をします。 startAt()を使用するは最後の1つを(あなたのリストの最後にすでにあり、それを複製します)を執行しないためです。

関連する問題