RecyclerView kitaplığı yeni SortedList
sınıfını yeni ekledi. Zaman içinde değişebilen bir compare()
yöntemini uygulayan bir geri çağırma yaptığımı varsayalım, yani Temel Karşılaştırıcı devre dışı bırakılabilir. Verilerini tamamen başvurmak için SortedList
'a söylemenin en iyi yolu nedir?RecyclerView'ın SortedList'e nasıl kopyalanacağı
cevap
İşte (KOTLIN yazılmış) üzerinde kendi önerilerimiz: Eğer, ben bu yüzden her öğe yalnızca bir kez başvurulan recalculatePositionOfItemAt()
ve hiçbir öğeye her görüşmeden sonra yeni endeks takip ediyorum görebileceğiniz gibi
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()
atlandı.
Bu, ancak gerçekten dehşet verici görünüyor çünkü recalculatePositionOfItemAt()
öğeyi kaldırmak ve sonra okumak için alttaki diziyi iki kez yeniden boyutlandırır. indexOf
daha sonra dizin zaten biliniyor olsa bile yeni bir ikili arama gerçekleştirecektir.
Düzenle: Öğeler eşit olarak karşılaştırılırsa, bu sonsuz bir döngüye neden olur.
Alternatif yaklaşım (tümünü kaldırmak, sonra tüm ekleyin):
list.beginBatchedUpdates()
val copy = (list.size() - 1 downTo 0).map { list.removeItemAt(it) }
copy.forEach { list.add(it) }
list.endBatchedUpdates()
Maalesef bunun için hiçbir API yoktur. Sadece kaynağı kopyalayın ve bu yöntemi kendiniz ekleyin. Yedekleme verileri sadece bir dizidir, böylece Arrays.sort'u arayabilir, sonra da veri setini değiştirdiğinizi bildirebilirsiniz. Tüm dünya değiştiğinde izleme listeleri, sıralama listesi için gerçekten uygun durumda değilken önemsiz değildir. Lütfen b.Android.com adresinden bir özellik isteği oluşturun.
Evet, 5'ten fazla ürüne tam olarak başvurmanın animasyonunun, gerçekten tuhaf görünmesini farkettim. –
Btw, kaynağı kopyalamanıza gerek yoktur. Alttaki dizi mData paketi özel olduğu için, aynı pakette bir yardımcı yardımıyla erişebilirsiniz. –
- 1. Bir komutun nasıl kopyalanacağı ve çalıştırılacağı (her eşleşme için)
- 2. Pandaların ardışık parçalarının verimli bir şekilde nasıl kopyalanacağı
- 3. R: bellek yetersiz kalmadan iki büyük veri çerçevesinin nasıl kopyalanacağı
- 4. PDF dosyasını javascript kullanarak okuma
- 5. Python: iki CSV'deki yollara göre dosyaları kopyalayıp yapıştırın
- 6. Sınıfları VBA'da kullanmanın yararları nelerdir?
- 7. Nasıl Nasıl değiştirebilirim CodeIgniter'da
- 8. nasıl
- 9. nasıl
- 10. nasıl
- 11. nasıl
- 12. nasıl
- 13. nasıl
- 14. nasıl
- 15. nasıl?
- 16. nasıl
- 17. nasıl
- 18. nasıl
- 19. nasıl
- 20. nasıl
- 21. nasıl
- 22. nasıl
- 23. nasıl
- 24. nasıl
- 25. nasıl
- 26. nasıl
- 27. nasıl
- 28. nasıl
- 29. nasıl
- 30. nasıl
'beginBatchedUpdates() ',' recalculatePositionOfItemAt() '(her öğe için) ve' endBatchedUpdates() 'değerini tahmin etmem gerekirse, bu yalnızca API'ye dayalı bir tahmindir. – CommonsWare
en kötü durum senaryosu, http://developer.android.com/reference/android/support/v7/widget/util/SortedListAdapterCallback.html geri aramanın bir öğenin ne zaman değiştirileceğine dair yöntemleri vardır, ancak doğru yanıt muhtemelen @CommonsWare ' cevap. – EpicPandaForce
Bu kötü bir başlangıç değil. Ancak her indeks için yeniden hesaplamakPositionOfItemAt(), tamamen başvurmaz. Bazı öğelerin atlanmasına neden olan endeksler değişecektir. –