#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?