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.

  • Por qué los numbers que aceptan nulos no son para preservar la identidad
  • Correctamente implementando esperar y notificar en Kotlin
  • NoSuchMethodError al llamar al método
  • Kotlin: exception de documento lanzada por un método de interfaz
  • Vista de actualización de Android después del éxito de JSONRequest
  • Kotlinx no puede resolver el símbolo "sintético"
  • Kotlin: cómo implementar un ItemClickListener para RecyclerVIew
  • Inicializar el campo de class abstracta en el constructor del niño
  • La versión 1.1.4-eap-77 de Kotlin no funciona
  • Smart Cast no funciona como se esperaba
  • Objeto burlado con Mockito Kotlin Método de anulación