【问题标题】:How to load more data when I click the button in android using firestore当我使用firestore单击android中的按钮时如何加载更多数据
【发布时间】: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


    【解决方案1】:

    quality_cr 是一个查询。但是您需要将 documentSnapshot 或您在 orderby 中使用的字段传递给 startAfter。 https://firebase.google.com/docs/reference/android/com/google/firebase/firestore/Query#startAfter(java.lang.Object...)

    因此,在您的 OnCompleteListener 中,您必须存储您的字段或 documentSnapshot,然后在 startAfter 按钮单击时使用它们

    我希望你明白了。

    【讨论】:

      猜你喜欢
      • 2017-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 2022-12-18
      • 1970-01-01
      相关资源
      最近更新 更多