Cómo utilizar completamente SortedList de RecyclerView

La biblioteca RecyclerView agregó recientemente la nueva class SortedList . Supongamos que tengo una callback que implementa un método de compare() que puede cambiar a lo largo del time, es decir, el comparador subyacente puede ser desactivado. ¿Cuál es la mejor manera de decirle a SortedList que SortedList completamente a sus datos?

Aquí está mi propia opinión (escrita en 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() 

Como puede ver, estoy rastreando el nuevo índice después de cada llamada para recalculatePositionOfItemAt() Ítem ​​en recalculatePositionOfItemAt() por lo que cada ítem se recurre solo una vez y no se salta ningún ítem.

Esto funciona pero parece realmente un desperdicio porque recalculatePositionOfItemAt() cambiará el tamaño de la matriz subyacente dos veces para eliminar y luego leer el elemento. indexOf realizará una nueva búsqueda binaria aunque el índice ya sea conocido.

Editar : Esto parece conducir a un ciclo infinito si los artículos se comparan como iguales.

Enfoque alternativo (eliminar todo, luego agregar todo):

 list.beginBatchedUpdates() val copy = (list.size() - 1 downTo 0).map { list.removeItemAt(it) } copy.forEach { list.add(it) } list.endBatchedUpdates() 

Lamentablemente, no hay API para esto. Solo copie la fuente y agregue ese método usted mismo. Los datos de respaldo son solo una matriz, por lo que puede llamar a Arrays.sort y luego cambiar el set de datos de notificación de llamadas. Los cambios de seguimiento no son triviales cuando todo el mundo cambia, por lo que no son realmente adecuados para la list orderada. Cree una request de function en b.Android.com.

  • Problemas henetworkingando la class interna de Java
  • Kotlin NullPointerException ocurrencia
  • Kotlin coroutines CalledFromWrongThreadException
  • La debugging de Android Kotlin Task no se encuentra en el proyecto raíz
  • Acceder a las properties de una tarea en gradle kotlin
  • Llamada API no funciona dentro de Anko Async
  • Cómo modificar la fuente de class para anotar la class Kotlin mediante el plugin Intellij Idea personalizado
  • MyBatis con classs de datos inmutables en Kotlin
  • Reino que devuelve datos obsoletos
  • Deserialization de KS JS JSON
  • Mutadores de Kotlin