ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Firestore를 사용하여 Android에서 button을 클릭 할 때 더 많은 데이터를 로드하는 방법
    카테고리 없음 2020. 8. 9. 03:21

    질문

    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을 누르면 마지막까지 두 개의 리뷰 된 댓글이 더 표시됩니다.


    답변1

    quality_cr은 쿼리입니다. 그러나 startAfter를 위해 orderby에서 사용하는 documentSnapshot 또는 필드를 전달해야합니다. https://firebase.google.com/docs/reference/android/com/google/firebase/firestore/Query#startAfter(java.lang.Object...)

    따라서 OnCompleteListener에서 필드 또는 documentSnapshot을 저장 한 다음 button 클릭시 startAfter에서 사용해야합니다.

    나는 당신이 그것을 얻길 바랍니다.



     

     

     

     

    출처 : https://stackoverflow.com/questions/62458867/how-to-load-more-data-when-i-click-the-button-in-android-using-firestore

    댓글

Designed by Tistory.