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 шт):
Я плохо понимаю, где находится код
commentsRef.addValueEventListener(new ValueEventListener() {...}
Но из того, что я увидел это то, что вы задаете список комментариев в конструкторе вашего адаптера и больше его нигде не изменяете в самом адаптере. Смею предположить, что вы не меняете сам список который находится в адаптере, потому собственно и не обновляет ничего notifyDataSetChanged.
Что бы я вам рекомендовал, так это вынести всю логику получения данных из адаптера, т.к. адаптер ничего не должен знать о существовании базы и прочих сущностях. Единственная задача адаптера это показывать список данных, который ему предоставляется извне. Для этих целей в адаптере можно создать метод типа такого:
public void update(List< EventComment > comments){
this.comments = comments;
notifyDataSetChanged();
}
И передавать эти данные извне в адаптер с помощью этого метода.