Próbuję odświeżyć określony element w RecyclerView
.
Historia: Za każdym razem, gdy użytkownik kliknie przedmiot, zostanie wyświetlony AlertDialog
. Użytkownik może wpisać tekst, klikając przycisk OK. Chcę pokazać ten tekst w tej pozycji i pokazać niewidoczny ImageView
- zadeklarowany w XML i adapter ViewHolder
-
Użyłem tej funkcji w AlertDialog
Positive Button, aby zaktualizować element:
private void updateListItem(int position) {
View view = layoutManager.findViewByPosition(position);
ImageView medicineSelected = (ImageView) view.findViewById(R.id.medicine_selected);
medicineSelected.setVisibility(View.VISIBLE);
TextView orderQuantity = (TextView) view.findViewById(R.id.order_quantity);
orderQuantity.setVisibility(View.VISIBLE);
orderQuantity.setText(quantity + " packet added!");
medicinesArrayAdapter.notifyItemChanged(position);
}
Ale ten kod nie tylko zmienia itemView na przekazanej pozycji, ale także zmienia niektóre inne itemView (s)!
Jak poprawnie zmienić konkretny itemView, klikając go?
onBindViewHolder()
Zaktualizuj pojedynczy element
notifyItemChanged(updateIndex)
Przykład
Zmień pozycję „Owce”, tak aby brzmiała „Lubię owce”.
Moja pełna odpowiedź z większą liczbą przykładów znajduje się tutaj .
źródło
Dodaj zmieniony tekst do listy danych modelu
źródło
Myślę, że mam pomysł, jak sobie z tym poradzić. Aktualizacja jest taka sama, jak usuwanie i zastępowanie w dokładnym miejscu. Więc najpierw usuwam element z tej pozycji, używając poniższego kodu:
a następnie dodałbym przedmiot w tej konkretnej pozycji, jak pokazano poniżej:
Próbuję to teraz wdrożyć. Dałbym ci informację zwrotną, kiedy skończę!
źródło
Musiałem rozwiązać ten problem, przechwytując pozycję elementu, który wymagał modyfikacji, a następnie w wywołaniu adaptera
, spowoduje to wywołanie onBindViewHolder (posiadacz ViewHolder, pozycja int) dla tego konkretnego elementu w tej konkretnej pozycji.
źródło
Poniższe rozwiązanie zadziałało dla mnie:
W elemencie RecyclerView użytkownik kliknie przycisk, ale inny widok, taki jak TextView, zostanie zaktualizowany bez bezpośredniego powiadamiania adaptera:
Znalazłem dobre rozwiązanie bez użycia metody notifyDataSetChanged (), ta metoda przeładowuje wszystkie dane z recyklingu, więc jeśli masz obraz lub wideo w elemencie, zostaną one ponownie załadowane, a wrażenia użytkownika nie będą dobre:
Oto przykład kliknięcia ikony ImageView podobnej do ikony i zaktualizowania tylko jednego widoku TextView (można zaktualizować więcej widoku w ten sam sposób dla tego samego elementu), aby wyświetlić aktualizację licznika po dodaniu +1:
źródło
Sposobem, który zadziałał dla mnie osobiście, jest użycie metod adaptera recyclinglerview do radzenia sobie ze zmianami w jego elementach.
Mogłoby to wyglądać podobnie do tego, utworzyć metodę w widoku niestandardowego recyklera, mniej więcej taką:
źródło
W swojej klasie adaptera, w metodzie onBindViewHolder, ustaw ViewHolder na setIsRecyclable (false) jak w poniższym kodzie.
źródło
wystarczy dodać następujący kod w oknie dialogowym ostrzeżenia po kliknięciu przycisku Zapisz
źródło
Problem polega na tym,
RecyclerView.Adatper
że nie ma żadnych metod, które zwracają indeks elementuMoje obejście polega na utworzeniu instancji mapy dla (element, pozycja) s
Friend
) powinien implementowaćhashCode()
iequals()
ponieważ jest kluczowy w hashmap.kiedy element się zmienił,
Dobrze jest zdefiniować metodę pomocniczą
Instancja mapy (
Map<Friend, Integer> posMap
) niekoniecznie jest wymagana. Jeśli mapa nie jest używana, pętla po całej liście może znaleźć pozycję elementu.źródło
To także mój ostatni problem. Tutaj moje rozwiązanie używam modelu danych i adaptera dla mojego RecyclerView
źródło
jeśli tworzysz jeden obiekt i dodajesz go do listy, której używasz w adapterze, gdy zmieniasz jeden element listy w adapterze, wszystkie inne elementy również się zmieniają, innymi słowy, wszystko zależy od odniesień, a twoja lista nie przechowywać oddzielne kopie tego pojedynczego obiektu.
źródło
W adapterze RecyclerView powinieneś mieć ArrayList oraz jedną metodę
addItemsToList(items)
dodawania elementów listy do ArrayList. Następnie możesz dodawać elementy listy, dzwoniącadapter.addItemsToList(items)
dynamicznie. Po dodaniu wszystkich elementów listy do ArrayList możesz zadzwonićadapter.notifyDataSetChanged()
aby wyświetlić listę.Możesz użyć
notifyDataSetChanged
w adapterze dla RecyclerViewźródło