notifyDataSetChanged не работает для RecyclerView

Мой класс адаптера

public class EventCommListAdapter extends RecyclerView.Adapter<EventCommListAdapter.CommentViewHolder> {
ArrayList<EventComment> comments;
int count;
DatabaseReference usersRef = FirebaseDatabase.getInstance().getReference("users");
public EventCommListAdapter(ArrayList<EventComment> comments){
    count = comments.size();
    this.comments = comments;
}
@NonNull
@Override
public CommentViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.event_comm_item, parent,
            false);
    CommentViewHolder vh = new CommentViewHolder(view);
    vh.root.setVisibility(View.GONE);
    return vh;
}

@Override
public void onBindViewHolder(@NonNull final CommentViewHolder holder, final int position) {
    usersRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot ds: dataSnapshot.getChildren()){
                if (ds.getKey().equals(comments.get(position).getSender())){
                    User user = ds.getValue(User.class);
                    holder.sender.setText(user.getFirstName()+" "+user.getLastName());
                }
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
    holder.text.setText(comments.get(position).getText());
    TimeZone tz = TimeZone.getTimeZone("GMT+03:00");
    Calendar c = Calendar.getInstance(tz);
    String time = String.format("%02d" , c.get(Calendar.HOUR_OF_DAY))+":"+
            String.format("%02d" , c.get(Calendar.MINUTE));
    String date = String.format("%02d" , c.get(Calendar.DAY_OF_MONTH))+"/"+
            String.format("%02d" , c.get(Calendar.MONTH))+"/"+
            String.format("%02d" , c.get(Calendar.YEAR));
    int difference = getDateDiff(date, comments.get(position).getDate());
    if (difference==0){
        holder.time.setText("Сьогодні • "+comments.get(position).getTime());
    }else if (difference==1){
        holder.time.setText("Вчора • "+comments.get(position).getTime());
    }else if (difference>1){
        Date formatedDate = null;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            SimpleDateFormat formatter=new SimpleDateFormat("dd/MM/yyyy");
            try {
                formatedDate =formatter.parse(comments.get(position).getDate());
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        Calendar cal = Calendar.getInstance();
        cal.setTime(formatedDate);
        holder.time.setText(checkMonth(cal.get(Calendar.MONTH))+" • "+time);
    }

    holder.root.setVisibility(View.VISIBLE);
}

@Override
public int getItemCount() {
    return count;
}

class CommentViewHolder extends RecyclerView.ViewHolder{
    public TextView sender;
    public TextView text;
    public TextView time;
    public LinearLayout root;
    public CommentViewHolder(@NonNull View itemView) {
        super(itemView);
        sender = itemView.findViewById(R.id.commSender);
        text = itemView.findViewById(R.id.commText);
        time = itemView.findViewById(R.id.commTime);
        root = itemView.findViewById(R.id.rootLayout);
    }
}

Я пытаюсь обновить список при добавлении новых данных в базу данных

commentsRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if (dataSnapshot.getChildrenCount()>0) {
                    comments.clear();
                    for (DataSnapshot ds : dataSnapshot.getChildren()) {
                        comments.add(ds.getValue(EventComment.class));
                    }
                    adapter.notifyDataSetChanged();
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });

Ответы (1 шт):

Автор решения: Sergei Buvaka

Я плохо понимаю, где находится код

commentsRef.addValueEventListener(new ValueEventListener() {...}

Но из того, что я увидел это то, что вы задаете список комментариев в конструкторе вашего адаптера и больше его нигде не изменяете в самом адаптере. Смею предположить, что вы не меняете сам список который находится в адаптере, потому собственно и не обновляет ничего notifyDataSetChanged.

Что бы я вам рекомендовал, так это вынести всю логику получения данных из адаптера, т.к. адаптер ничего не должен знать о существовании базы и прочих сущностях. Единственная задача адаптера это показывать список данных, который ему предоставляется извне. Для этих целей в адаптере можно создать метод типа такого:

public void update(List< EventComment > comments){
    this.comments = comments;
    notifyDataSetChanged();
}

И передавать эти данные извне в адаптер с помощью этого метода.

→ Ссылка