У меня есть два набора хранилищ данных в firestore (качество, справедливость). Они оба являются отзывами пользователей, и я хочу составить список комментариев, отсортированных по дате, чтобы одновременно отображать и качество, и объективность. Он работает нормально, но я хочу продолжить работу над созданием кнопки «увидеть больше». Когда пользователи заходят на страницу отзывов, каждый раз будет отображаться только два комментария, если только пользователи не нажмут кнопку «увидеть больше». Программа поместит еще два комментария в список и отобразит их в пользовательском интерфейсе. На картинке представлена структура моей базы данных firebase firestore
Путь такой: "user_review" | - "(usr_id)" | - "качество" | - "(comment_person_uid)" | -post_id / quality_rating / review_time / reviewer_id / text_review
Вот функция, которую я должен загрузить в первую очередь два отзыва, другой идентификатор профиля - (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));
}
}
}
});
Это кнопка, когда я нажимаю кнопку подробнее, я использовал startAfter (quality_cr) как в приведенном выше запросе, но он дает мне ошибку времени выполнения
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;
}
Однако, когда я нажимаю кнопку, он не показывает два новых данных. Любая помощь будет признательна. Я хочу сначала загрузить первые два отзыва в пользовательский интерфейс, и когда я нажимаю кнопку see_more, отображаются еще два проверенных комментария до конца.