Как загрузить больше данных, когда я нажимаю кнопку в android с помощью firestore - PullRequest
0 голосов
/ 18 июня 2020

У меня есть два набора хранилищ данных в firestore (качество, справедливость). Они оба являются отзывами пользователей, и я хочу составить список комментариев, отсортированных по дате, чтобы одновременно отображать и качество, и объективность. Он работает нормально, но я хочу продолжить работу над созданием кнопки «увидеть больше». Когда пользователи заходят на страницу отзывов, каждый раз будет отображаться только два комментария, если только пользователи не нажмут кнопку «увидеть больше». Программа поместит еще два комментария в список и отобразит их в пользовательском интерфейсе. На картинке представлена ​​структура моей базы данных firebase firestore enter image description here

Путь такой: "user_review" | - "(usr_id)" | - "качество" | - "(comment_person_uid)" | -post_id / quality_rating / review_time / reviewer_id / text_review

enter image description here

Вот функция, которую я должен загрузить в первую очередь два отзыва, другой идентификатор профиля - (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, отображаются еще два проверенных комментария до конца.

1 Ответ

1 голос
/ 19 июня 2020

Quality_cr - это запрос. Но вам нужно передать documentSnapshot или поля, которые вы используете, по порядку для startAfter. https://firebase.google.com/docs/reference/android/com/google/firebase/firestore/Query#startAfter (java .lang.Object ...)

Итак, в вашем OnCompleteListener вы должны сохранить либо свое поле, либо documentSnapshot, а затем использовать их в кнопке startAfter on нажмите

Надеюсь, вы поняли.

...