0

Firestore를 사용하여 레코드보기에서 더 많은 데이터를로드하는 방법을 알고 싶었습니다.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(), 지정된 DocumentSnapshotendAt(), endBefore().

나는 당신의 컬렉션 "인터뷰"라고 생각하면,이처럼 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()을 사용해야합니다.

관련 문제