Biblioteka RecyclerView ostatnio dodała nową klasę SortedList
. Załóżmy, że mam wywołanie zwrotne, które implementuje metodę compare()
, która może się zmieniać w czasie, tj. Bazowy Komparator może zostać wyłączony. Jaki jest najlepszy sposób, aby powiedzieć SortedList
, aby w pełni wykorzystać swoje dane?Jak całkowicie uciec RecyclerView's SortedList
Odpowiedz
Oto moje własne spojrzenie na niego (napisany w Kotlin):
list.beginBatchedUpdates()
val indices = (0..list.size() - 1).toArrayList()
while (!indices.isEmpty()) {
val i = indices.first()
val item = list.get(i)
list.recalculatePositionOfItemAt(i)
[suppress("USELESS_CAST_STATIC_ASSERT_IS_FINE")]
indices.remove(list.indexOf(item) as Any) //cast to disambiguate remove()
}
list.endBatchedUpdates()
Jak widać, jestem śledzenia nowego indeksu po każdym wywołaniu recalculatePositionOfItemAt()
więc każdy element uciekamy się tylko raz i nie ma pozycji jest pomijany.
To działa, ale wydaje się być naprawdę nieekonomiczne, ponieważ recalculatePositionOfItemAt()
zmieni dwukrotnie rozmiar podstawowej tablicy, aby usunąć, a następnie odczytać element. indexOf
następnie wykona nowe wyszukiwanie binarne, mimo że indeks jest już znany.
Edytuj: To wydaje się prowadzić do nieskończonej pętli, jeśli elementy są porównywane jako równe.
Alternatywne podejście (usuń wszystko, a następnie dodać wszystkie):
list.beginBatchedUpdates()
val copy = (list.size() - 1 downTo 0).map { list.removeItemAt(it) }
copy.forEach { list.add(it) }
list.endBatchedUpdates()
Niestety, nie ma do tego API. Wystarczy skopiować źródło i samodzielnie dodać tę metodę. Dane kopii zapasowej to tylko tablica, więc możesz wywołać na niej plik Arrays.sort, a następnie zmienić zestaw danych powiadomień. Zmiany w śledzeniu nie są banalne, gdy cały świat się zmienia, więc nie jest tak naprawdę odpowiedni przypadek dla posortowanej listy. Utwórz żądanie funkcji na stronie b.Android.com.
Tak, zdałem sobie sprawę, że animowanie kompletnego uciekania się na więcej niż 5 przedmiotach wygląda tak naprawdę dziwnie. –
Btw, nie musisz kopiować źródła. Ponieważ podstawowa tablica mData jest pakietem prywatnym, możesz uzyskać do niej dostęp za pośrednictwem helpera w tym samym pakiecie. –
- 1. Jak przekonwertować SortedList na SortedList <>
- 2. C# Linq return SortedList
- 3. Jak uciec ":"?
- 4. Scolling with multiple RecyclerViews w layoucie
- 5. Jak uciec z łańcucha JSON?
- 6. jak uciec% at cmd setx?
- 7. Jak uciec% w printfn/sprintf?
- 8. Jak uciec struny w pdo?
- 9. SortedList indeksowany przez coś innego niż klucz
- 10. C# szybciej niż SortedList sortowanie <>
- 11. całkowicie usunąć
- 12. Jak całkowicie usunąć zduplikowane wiersze
- 13. Jak całkowicie wyłączyć przycisk łącza?
- 14. Jak wygenerować całkowicie losowy obraz?
- 15. Jak całkowicie wyłączyć pamięć podręczną?
- 16. Jak całkowicie wyłączyć Sitecore Analytics
- 17. Meta Description cytaty uciec
- 18. Emacs uciec klucz
- 19. Jak mogę uciec przed ukośnikiem w vi?
- 20. Jak uciec od zarezerwowanego słowa w Delphi?
- 21. Jak uciec spacji w aliasie bash?
- 22. Jak uciec @ w haśle w połączeniu pymongo?
- 23. Jak uciec ciąg znaków dla wygenerowanego C++?
- 24. Jak uciec f: selectItem itemLabel atrybut
- 25. Jak uciec przed ukośnikiem w R?
- 26. Jak uciec z myślnika "-" w symbolu rubinu?
- 27. Jak uciec z ukośnika w trybie org?
- 28. Jak mogę uciec tag ERB w ERB
- 29. Jak uciec wartości szesnastkowe w netcata
- 30. Jak uciec znaki specjalne HTML w Javie?
Gdybym musiał zgadywać, 'beginBatchedUpdates()', 'recalculatePositionOfItemAt()' (dla każdego przedmiotu) i 'endBatchedUpdates()', ale to tylko domysły oparte na API. – CommonsWare
najgorszy scenariusz, http://developer.android.com/reference/android/support/v7/widget/util/SortedListAdapterCallback.html wywołanie zwrotne ma metody, kiedy element jest zmieniany, ale właściwą odpowiedzią jest prawdopodobnie @CommonsWare ' s odpowiedź. – EpicPandaForce
To nie jest zły początek. Ale wywoływanie recalculatePositionOfItemAt() dla każdego indeksu nie ucieknie go całkowicie. Indeksy ulegną zmianie, co prowadzi do pominięcia niektórych elementów. –