Как полностью использовать RecyclerView's SortedList

Библиотека RecyclerView недавно добавила новый класс SortedList . Предположим, у меня есть обратный вызов, который реализует метод compare() который может меняться со временем, то есть базовый Компаратор может быть отключен. Каков наилучший способ сказать SortedList полностью использовать свои данные?

Вот мое собственное взятие (написано в Котлине):

 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() 

Как вы можете видеть, я отслеживаю новый индекс после каждого вызова recalculatePositionOfItemAt() поэтому каждый элемент применяется только один раз, и ни один элемент не пропускается.

Это работает, но кажется действительно расточительным, потому что recalculatePositionOfItemAt() будет изменять размер базового массива дважды, чтобы удалить, а затем прочитать элемент. indexOf затем выполнит новый двоичный поиск, даже если индекс уже известен.

Edit : Кажется, что это приводит к бесконечному циклу, если элементы сравниваются как равные.

Альтернативный подход (удалить все, а затем добавить все):

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

К сожалению, для этого нет апи. Просто скопируйте источник и добавьте этот метод самостоятельно. Резервное копирование данных – это всего лишь массив, поэтому вы можете вызвать Arrays.sort на нем, а затем изменить имя набора уведомлений. Отслеживание изменений не является тривиальным, когда весь мир меняется, поэтому не подходит для отсортированного списка. Создайте запрос функции на b.Android.com.