firestore에 두 세트의 데이터 저장소가 있습니다 (품질, 공정성). 둘 다 사용자의 리뷰이며, 동시에 품질 및 공정성 리뷰를 표시하기 위해 날짜별로 정렬 된 댓글 목록을 만들고 싶습니다. 잘 작동하지만 "더보기"button을 만들기 위해 추가 작업을하고 싶습니다. 사용자가 리뷰 페이지에 들어갈 때 사용자가 "더보기"button을 누르지 않는 한 매번 두 개의 댓글 만 표시됩니다. 프로그램은 또 다른 두 개의 주석을 목록에 넣고 UI에 표시합니다. 사진은 내 firebase firestore 데이터베이스의 구조입니다.
경로는 다음과 같습니다. "user_review"|- "(usr_id)"|- "quality"|- "(comment_person_uid)" | -post_id / quality_rating / review_time / reviewer_id / text_review
다음은 처음 두 리뷰를로드해야하는 함수입니다. otherProfileID는 (usr_id)입니다. 제한을 설정하면 잘 작동합니다 (2).
has_comm = new ArrayList<>();
quality_cr = FirebaseFirestore.getInstance().collection("user_reviews").document(otherProfileID).collection("quality").orderBy("review_time").limit(2); //.whereGreaterThan("text_review", "")
//final Query fairness_cr = FirebaseFirestore.getInstance().collection("user_reviews").document(otherProfileID).collection("fairness").whereGreaterThan("text_review", "");
quality_cr.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
Log.d ("two_only", "print");
has_comm.clear();
for (QueryDocumentSnapshot doc : task.getResult()) {
String quality_rating = doc.get("quality_rating").toString();
String post_id = doc.get("post_id").toString();
String review_time = doc.get("review_time").toString();
String reviewer_id = doc.get("reviewer_id").toString();
String text_review = doc.get("text_review").toString();
single_review = new Review(quality_rating, post_id, review_time, reviewer_id, text_review);
has_comm.add(single_review);
review_adapter = new Review_Adapter(getApplicationContext(), has_comm);
Log.d ("two_only", has_comm + " ");
rvr.setAdapter(review_adapter);
//rvr.setLayoutManager(new LinearLayoutManager(this));
}
}
}
});
button 을 클릭했을 때의 button입니다. 더보기 위의 쿼리로 startAfter (quality_cr)를 사용했지만 runtime 오류가 발생합니다.
see_more.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//This query gives me run-time error
Query two_more = FirebaseFirestore.getInstance().collection("user_reviews").document(otherProfileID).collection("quality").orderBy("review_time").startAfter(quality_cr).limit(2); //.orderBy("review_time", Query.Direction.DESCENDING)
two_more.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
has_comm.clear();
for (QueryDocumentSnapshot doc : task.getResult()) {
String quality_rating = doc.get("quality_rating").toString();
String post_id = doc.get("post_id").toString();
String review_time = doc.get("review_time").toString();
String reviewer_id = doc.get("reviewer_id").toString();
String text_review = doc.get("text_review").toString();
single_review = new Review(quality_rating, post_id, review_time, reviewer_id, text_review);
has_comm.add(single_review);
review_adapter = new Review_Adapter(getApplicationContext(), has_comm);
rvr.setAdapter(review_adapter);
adapter.notifyDataSetChanged();
Log.d("two_only", quality_rating + " " + post_id + " " + has_comm);
}
}
}
});
}
});
그리고 이것은 참조 용으로 만 사용하는 내 recyclerview 및 리뷰 모델입니다.
Review_Adapter
public class Review_Adapter extends RecyclerView.Adapter<Review_Adapter.CommentViewHolder>{
Context context;
private LayoutInflater mInflater;
String commented_userid = "";
public ArrayList<Review> comm_list;
private HashMap<String, String> review_hash;
public Review_Adapter(Context context, ArrayList<Review> comm_list) {
this.mInflater = LayoutInflater.from(context);
this.context = context;
this.comm_list = comm_list;
}
@Override
public CommentViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = mInflater.inflate(R.layout.layout_comment, parent, false);
return new CommentViewHolder(view);
}
@Override
public void onBindViewHolder(final CommentViewHolder holder, int position) {
Review c = comm_list.get(position);
holder.Comment.setText(c.getText_review());
String oldstring = c.getReview_time();
Date dt = new Date(oldstring);
String timeStamp = new SimpleDateFormat("MMM dd, yyyy").format(dt);
holder.CommentedDate.setText(timeStamp);
commented_userid = c.getReviewer_id();
FirebaseFirestore.getInstance().collection("users").document(commented_userid).get()
.addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
Map udata = task.getResult().getData();
String first_name = udata.get("first_name").toString();
String last_name = udata.get("last_name").toString();
String fullname = first_name + " " + last_name;
holder.CommentedFullName.setText(fullname);
String username = udata.get("username").toString();
holder.CommentedUser.setText(username);
if(udata.get("profile_pic")!=null){
Map pic = (Map) udata.get("profile_pic");
String url = pic.get("url_link").toString();
Log.d("review_adaper",url);
Picasso.get().load(url).into(holder.CommentedIcon);
}
}
});
}
@Override
public int getItemCount() {
return comm_list.size();
}
public class CommentViewHolder extends RecyclerView.ViewHolder {
private ImageView CommentedIcon;
private TextView CommentedFullName;
private TextView CommentedUser;
private TextView CommentedDate;
private TextView Comment;
public CommentViewHolder(View view) {
super(view);
CommentedIcon= (ImageView) view.findViewById(R.id.commented_icon);
CommentedFullName= (TextView) view.findViewById(R.id.commented_fullname);
CommentedUser = (TextView) view.findViewById(R.id.commented_user);
CommentedDate = (TextView) view.findViewById(R.id.commented_date);
Comment = (TextView) view.findViewById(R.id.commented);
}
}
private void removeItem(int value) {
comm_list.remove(value);
notifyItemRemoved(value);
notifyItemRangeChanged(value, comm_list.size());
}
public class Review {
String quality_rating;
String post_id;
String review_time;
String reviewer_id;
String text_review;
public Review(){
//
}
public Review(String quality_rating, String post_id, String review_time, String reviewer_id, String text_review){
this.quality_rating=quality_rating;
this.post_id=post_id;
this.review_time=review_time;
this.reviewer_id=reviewer_id;
this.text_review=text_review;
}
public String getQuality_rating() {
return quality_rating;
}
public String getPost_id() {
return post_id;
}
public String getReview_time() {
return review_time;
}
public String getReviewer_id() {
return reviewer_id;
}
public String getText_review() {
return text_review;
}
그러나 button을 누르면 두 개의 새로운 데이터가 표시되지 않습니다. 어떤 도움을 주시면 감사하겠습니다. 먼저 UI에 처음 두 개의 리뷰를로드하고 싶습니다. see_more button을 누르면 마지막까지 두 개의 리뷰 된 댓글이 더 표시됩니다.