Изменить порядок сортировки с помощью SortedList и RecyclerView

Я использую SortedList, который используется для фильтрации данных в RecyclerView в отношении текущего запроса в SearchView, как описано в Как отфильтровать RecyclerView с помощью SearchView.

Проблема в том, что порядок элементов также должен иметь возможность изменяться. SortedList взаимодействует с Adapter через класс Callback, который имеет метод compare. Мне нужно будет изменить его, если пользователь изменит способ сортировки элементов, но я не уверен, как я могу это сделать.

Текущая ситуация требует только изменения порядка, поэтому эту проблему можно решить с помощью LinearLayoutManager с setReversedLayout(true), но мне было бы интересно, как я могу обеспечить совершенно другой способ сортировки элементов в SortedList.


person neits    schedule 15.11.2016    source источник


Ответы (2)


SortedList API не поддерживает динамическое изменение условий сортировки списка. Он предназначен для поддержки одновременного изменения критериев сортировки отдельного товара или партии товаров. Например, поддерживается сценарий, когда значение приоритета элемента X увеличивается, а список сортируется по приоритету. Но не тогда, когда условие сортировки меняется на сортировку по дате.

Ваше дело лучше всего решено так, как вы, с setReversedLayout(). Другим (относительно чистым) подходом может быть создание экземпляра нового SortedList с другим экземпляром SortedList.Callback, который поддерживает новую сортировку, добавление всех элементов из старого списка, указание ViewHolder использовать вместо этого новый список и запуск notifyDataSetChanged() на Adapter.

person kor    schedule 15.11.2016

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

Ты можешь использовать

recyclerView.swapAdapter(newAdapter, false);` 

Если в вашем адаптере есть стабильные идентификаторы, вы получите красивую анимацию. Потому что swapAdapter() помогает RecyclerView повторно использовать держателей представлений.

person cokceken    schedule 16.11.2016