【发布时间】:2020-06-18 20:29:58
【问题描述】:
我在 Firestore 中有两组数据存储(质量、公平)。它们都是来自用户的评论,我想制作一个按日期排序的 cmets 列表,以同时显示质量和公平评论。它工作正常,但我想进一步创建一个“查看更多”按钮。当用户进入评论页面时,除非用户点击“查看更多”按钮,否则每次只会显示两个cmets。该程序会将另外两个 cmets 放入 List 并显示在 UI 中。图片是我的firebase firestore数据库的结构
路径类似于:“user_review”|-“(usr_id)”|-“质量”|- “(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 时的按钮查看更多信息,我使用 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模型,仅供你参考。
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;
}
但是,当我按下按钮时,它没有显示两个新数据。任何帮助将不胜感激。我想先在 UI 中加载前两条评论,当我按下 see_more 按钮时,它会显示另外两条评论的 cmets,直到结束。
【问题讨论】:
标签: java android firebase google-cloud-firestore