5

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ğı

+1

'beginBatchedUpdates() ',' recalculatePositionOfItemAt() '(her öğe için) ve' endBatchedUpdates() 'değerini tahmin etmem gerekirse, bu yalnızca API'ye dayalı bir tahmindir. – CommonsWare

+0

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

+0

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. –

cevap

1

İş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() 
0

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.

+0

Evet, 5'ten fazla ürüne tam olarak başvurmanın animasyonunun, gerçekten tuhaf görünmesini farkettim. –

+0

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. –