Проблема с классом адаптера, нет cra sh, но страница зависает и перезагружается - PullRequest
0 голосов
/ 07 марта 2020

В моем классе CommentAdapter. java у меня есть следующий код. Когда пользователь оставляет комментарий к определенному сообщению, значок изображения должен смениться с черного значка чата на желтый значок чата. Работает отлично. Проблема возникает, когда пользователь удалил комментарий, оставленный им в записи. Если они удаляют свой комментарий и других пользователей от этого поста к этому сообщению нет, значок чата должен быть изменен с желтого на черный.

Это работает, и я получаю желаемый результат, но по какой-то причине он выбрасывает нулевой указатель, страница зависает, перезагружается, а затем возвращает меня на домашнюю страницу с желаемым результатом. Мне нужно, чтобы весь процесс проходил гладко, очевидно, без каких-либо нулевых указателей.

И да, очевидно, я знаю, что такое нулевые указатели и как их исправить, но здесь я не могу понять, почему я их получаю. Значок чата существует и все.

Cra sh линия помечена стрелкой ниже.

CommentAdapter

public class CommentAdapter extends RecyclerView.Adapter<CommentAdapter.ViewHolder> {

    ImageView mImageView;

    private Context mContext;
    private List<Comment> mComment;
    private String postid;
    private FirebaseUser mFirebaseUser;

    public CommentAdapter(Context mContext, List<Comment> mComment, String postid) {
        this.mContext = mContext;
        this.mComment = mComment;
        this.postid = postid;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.comment_item, parent, false);
        return new CommentAdapter.ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {

        mFirebaseUser = FirebaseAuth.getInstance().getCurrentUser();
        final Comment comment = mComment.get(position);

        holder.comment.setText(comment.getComment());
        getUserInfo(holder.image_profile, holder.username, comment.getPublisher());

 holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(final View v) {
                if (comment.getPublisher().equals(mFirebaseUser.getUid())) {

                    AlertDialog alertDialog = new AlertDialog.Builder(mContext).create();
                    alertDialog.setTitle("Do you want to delete this comment?");
                    alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "No",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    dialog.dismiss();
                                }
                            });
                    alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "Yes",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    Log.d("POSTID ->", postid);
                                    FirebaseDatabase.getInstance().getReference("Comments").child(postid).child(comment.getCommentid())
                                            .setValue(null).addOnCompleteListener(new OnCompleteListener<Void>() {
                                        @Override
                                        public void onComplete(@NonNull Task<Void> task) {
                                            if (task.isSuccessful()) {
   -------------------------------------------> mImageView.setImageResource(R.drawable.ic_chat_black);
                                                Toast.makeText(mContext, "Your comment has been deleted", Toast.LENGTH_SHORT).show();
                                            }
                                        }
                                    });
                                    dialog.dismiss();
                                }
                            });
                    alertDialog.show();
                }
                return true;
            }
        });

 public static class ViewHolder extends RecyclerView.ViewHolder {

        ImageView image_profile, imageView;
        public TextView username, comment;

        ViewHolder(@NonNull View itemView) {
            super(itemView);

            image_profile = itemView.findViewById(R.id.image_profile);
            comment = itemView.findViewById(R.id.comment);
            username = itemView.findViewById(R.id.username);
            imageView = itemView.findViewById(R.id.commentPost);
        }
    }

Logcat

E / AndroidRuntime: ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: основной процесс: com.e.events, PID: 18463 java .lang.NullPointerException: попытка вызвать виртуальный метод 'void android .widget.ImageView.setImageResource (int) 'для ссылки на пустой объект на com.e.events.Adapter.CommentAdapter $ 3 $ 2 $ 1.onComplete (CommentAdapter. java: 110) на com.google. android .gms.tasks.zzj.run ( Неизвестный источник: 4) в android .os.Handler.handleCallback (обработчик. java: 907) в android .os.Handler.dispatchMessage (обработчик. java: 105) в android .os. Looper.l oop (Looper. java: 216) в android .app.ActivityThread.main (ActivityThread. java: 7625) в java .lang.reflect.Method.invoke (собственный метод) в com. android .internal.os.RuntimeInit $ MethodAndArgsCaller.run (RuntimeInit. java: 524) в com. android .internal.os.ZygoteInit.main (ZygoteInit. java: 987)

1 Ответ

0 голосов
/ 07 марта 2020

Если ваш класс «Комментарий» является пользовательским, я предлагаю сохранить значение ресурса изображения в самом классе «Комментарий», а затем обновить адаптер при изменении значения изображения в комментарии. Это должно выглядеть примерно так:

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position){
    // ...

    final Comment comment = mComment.get(position);

    // Use a getter you defined in your Comment class to set the ViewHolder's image
    // (Make sure your ViewHolder class has an ImageView in it for this to work)
    // *(Also, make sure your Comment class already has a default Image Resource
    // value assigned within it)
    holder.myImageView.setImageResource(comment.getImgResource());

    // ...
}

Затем внутри вашего обратного вызова, где вы ранее устанавливали ресурс изображения:

if(task.isSuccessful){
    // Update the image resource stored in the Comment
    comment.setImgResource(myNewImageResource);

    // Anything else you want to do ...

    notifyDataSetChanged(); // Notify the adapter to refresh
}
...