Адаптер notifyDataSetChanged не обновляет представление списка

#java #android #listview #adapter

Вопрос:

Как говорится в названии, я не могу обновить свой список. Я работаю над приложением QR-сканера визитных карточек, и всякий раз, когда я сканирую действительный QR-код, запускается функция ContactInfoActivity, которая предоставляет мне информацию о визитной карточке другого пользователя и сохраняет ее в зарегистрированных контактах пользователей (в моей базе данных Firestore). Возвращаясь назад, приложение возвращается к фрагменту списка контактов в основной активности (который находится на вкладке с домашним фрагментом). Фрагмент списка контактов выглядит следующим образом:

 private CollectionReference colRef;  private Listlt;Contactgt; contacts = new ArrayListlt;gt;();  private ArrayAdapterlt;Contactgt; adapter;  private ListView listView;  private FirebaseFirestore db;  private CollectionReference collectionReference;   ...   @Override  public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {  super.onViewCreated(view, savedInstanceState);   listView = view.findViewById(R.id.contact_list);   colRef = db.collection("users").document(currentUserUID).collection("contacts");  collectionReference.get().addOnSuccessListener(queryDocumentSnapshots -gt;   {  queryDocumentSnapshots.getDocuments().forEach(documentSnapshot -gt;   contacts.add(documentSnapshot.toObject(Contact.class)));   adapter = new ArrayAdapterlt;gt;(view.getContext(), R.layout.fragment_contact_row, R.id.row_name, contacts);  listView.setAdapter(adapter);  listView.setOnItemClickListener((parent, view1, position, id) -gt; {  Intent intent = new Intent(getActivity(), ContactInfoActivity.class);  intent.putExtra("contact", contacts.get(position));  startActivity(intent);  });    });   }  

и все работает нормально, контакты извлекаются из базы данных и устанавливаются в списке. Однако, если я вернусь из ScanActivity (после добавления нового контакта в контакты пользователя в базе данных) или из ContactInfoActivity (после удаления контакта и удаления его из базы данных), я хотел бы, чтобы представление списка обновилось. Для этой цели я поставил

 @Override  public void onResume() {  colRef.get().addOnSuccessListener(queryDocumentSnapshots -gt;  {  contacts.clear();  queryDocumentSnapshots.getDocumentChanges().forEach(documentChange -gt;  contacts.add(documentChange.getDocument().toObject(Contact.class)));  //listView.setAdapter(new ArrayAdapterlt;gt;(getActivity(), R.layout.fragment_contact_row,R.id.row_name, contacts));  adapter.clear();  adapter.addAll(contacts);  adapter.notifyDataSetChanged();  }  );  super.onResume();  }  

и я понятия не имею, почему это не работает. Я перепробовал почти все и обнаружил, что если я сброшу адаптер, то строка с комментариями в onResume будет работать (но я нахожу это расточительным). Еще более странным является тот факт, что если я использую вид поиска (я опустил инфляцию меню, чтобы оно было коротким) с

 new SearchView.OnQueryTextListener() {  ...  @Override  public boolean onQueryTextChange(String newText) {  adapter.getFilter().filter(newText);  return false;  }  };  

it’s update the listview after going back from the searchBar. Any idea? Thank you in advance i will appreciate any suggestion!

Edit i tried to add

 DatabaseUtils.contactsRef.addSnapshotListener((value, e) -gt; {  if (e != null) {  return;  }  contacts.clear();  value.getDocuments().forEach(doc -gt; contacts.add(doc.toObject(Contact.class)));  adapter.clear();  adapter.addAll(contacts);  adapter.notifyDataSetChanged();  });  

but nothing changes. Why using the searchbar updates the adapter while i’m not able to update it manually?