Показать определенные c комментариев от адаптера в recyclerview - PullRequest
0 голосов
/ 06 мая 2020

Я работаю над сеансом комментариев в приложении android, используя модель с FirestoreRecyclerAdapter. Комментарии хранятся в Firestore, и я использую модель и адаптер для отображения текста комментариев, который хранится в text_review. Вот моя модель:

public class Comment {
    float fireness_rating;
    String post_id;
    String review_time;
    String receiver_id;
    String text_review;


    public Comment(){
        //empty const needed.
    }

    Comment(float fireness_rating, String post_id, String review_time, String receiver_id, String text_review){
        this.fireness_rating=fireness_rating;
        this.post_id=post_id;
        this.review_time=review_time;
        this.receiver_id=receiver_id;
        this.text_review=text_review;

    }

    public float getFireness_rating() {
        return fireness_rating;
    }

    public String getPost_id() {
        return post_id;
    }

    public String getReview_time() {
        return review_time;
    }

    public String getReceiver_id() {
        return receiver_id;
    }

    public String getText_review() {
        return text_review;
    }
}


Модель содержит пять элементов, но я в основном сосредоточен на text_review. Если у пользователя есть текстовые комментарии внутри, text_review будет содержать текст, который пользователи вводят и сохраняют в firestore. Это структура firestore после комментариев пользователя с text_review.

enter image description here

Как я уже упоминал, если внутри нет фактического текстового комментария, text_review должен быть пустым . Я создал адаптер для рекурсии всего списка комментариев, отображаемых на страницах моих действий. Вот мой адаптер.

public class Comment_Adapter extends FirestoreRecyclerAdapter<Comment, Comment_Adapter.CommentHolder> {

    public Comment_Adapter(@NonNull FirestoreRecyclerOptions<Comment> options){
        super(options);
    }

    @Override
    protected void onBindViewHolder(@NonNull final CommentHolder holder, int i, @NonNull Comment model) {

        final String commented_userid = model.getReceiver_id();
        Log.d("comment_adapter_debug", commented_userid);

        //shown only if the use has comment which in text_review
        Query q = FirebaseFirestore.getInstance().collection("user_reviews").document(commented_userid).collection("fairness").whereGreaterThan("text_review", "");
        q.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                Log.d("comment_adapter_debug", "has comment inside x");

                //retrieve info, you can ignore this part.               FirebaseFirestore.getInstance().collection("users").document(commented_userid).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                        if (task.isSuccessful()) {
                            DocumentSnapshot document = task.getResult();
                            String first_name = document.get("first_name").toString();
                            String last_name = document.get("last_name").toString();
                            String username = document.get("username").toString();
                            Log.d("comment_adapter_debug", first_name + " " + last_name + ": w/ username= " + username);

                            holder.CommentedFullName.setText(first_name + " " + last_name);
                            holder.CommentedUser.setText("@" + username);
                        } else {
                            Log.d("comment_adapter_debug", "no comment yet for this user.");
                        }

                    }
                });
            }

        });
        String oldstring = model.getReview_time();
        Date dt = new Date(oldstring);
        String timeStamp = new SimpleDateFormat("MMM dd, yyyy").format(dt);
        holder.CommentedDate.setText(timeStamp);
        holder.Comment.setText(model.getText_review());

    }

    @NonNull
    @Override
    public CommentHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_comment, parent, false);
        return new CommentHolder(v);
    }

    class CommentHolder extends RecyclerView.ViewHolder{
        private ImageView CommentedIcon;
        private TextView CommentedFullName;
        private TextView CommentedUser;
        private TextView CommentedDate;
        private TextView Comment;

        public CommentHolder(View itemView){
            super(itemView);
            CommentedIcon = itemView.findViewById(R.id.commented_icon);
            CommentedFullName = itemView.findViewById(R.id.commented_fullname);
            CommentedUser = itemView.findViewById(R.id.commented_user);
            CommentedDate = itemView.findViewById(R.id.commented_date);
            Comment = itemView.findViewById(R.id.commented);
        }
    }

}

и это изображение enter image description here

Все, что я хочу, - это показать, что есть настоящий комментарий («ааа» из pi c), а красный кружок не должен отображаться, так как комментариев не существует ("text_review" == ""). Мой подход состоит в том, чтобы сделать запрос whereGreaterThan ("text_review", ""), что означает проверить, содержит ли text_review текст. Если да, покажите список, иначе пропустите весь список. Я знаю, что это немного длинновато, но любая помощь будет признательна

1 Ответ

0 голосов
/ 07 мая 2020

Спасибо за редактирование вашего вопроса!

Учитывая вашу базу данных, я бы попробовал использовать приведенный ниже образец кода, чтобы проверить, имеет ли text_review значение для правильной его печати. ​​

...
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
    if (task.isSuccessful()) {
        DocumentSnapshot document = task.getResult();
        String first_name = document.get("first_name").toString();
        String last_name = document.get("last_name").toString();
        String username = document.get("username").toString();
        if (document.exists()) {
            if (document.get("text_review") != null) {
                Log.d("comment_adapter_debug", first_name + " " + last_name + ": w/ username= " + username);
                holder.CommentedFullName.setText(first_name + " " + last_name);
                holder.CommentedUser.setText("@" + username);
            } else {
                Log.d("comment_adapter_debug", "no comment yet for this user.");
            }
        }
    }
}
...

Хотя этот код не протестирован , я считаю, что он должен помочь вам в качестве отправной точки. Как вы можете это проверить, вы будете проверять в части document.get("text_review"), является ли значение null или нет, и на его основе распечатайте информацию по своему усмотрению. Если это не так, он напечатает, что пользователь еще не оставил комментарий - или вы можете изменить последний Log.d, если хотите.

Сообщите мне, помогла ли вам информация!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...