Я пишу простое приложение в стиле списка дел для android, и у меня возникли проблемы с добавлением функции сортировки.
У меня есть экран с RecyclerView
, показывающий все списки, принадлежащие user, и я хотел бы добавить функцию, которая позволяет пользователю включать или отключать сортировку. Проблема в том, что я не могу найти способ, чтобы список, отображаемый для пользователя, оставался постоянно отсортированным после внесения другого изменения.
Допустим, списки хранятся в базе данных Room
. Самый простой и наиболее последовательный способ добиться того, чего я хочу, - это отсортировать данные в самой базе данных, но, вероятно, это не путь к go, так как это было бы сложно реализовать (если даже возможно).
Скорее всего, мне следует отсортировать данные локально в моей модели представления. Я подумал, что могу сделать это, используя MediatorLiveData
, который будет наблюдать за базой данных, а сам за ним будет наблюдать активность хоста. Перед обновлением MediatorLiveData
я бы отсортировал список с помощью флага isSorting
, чтобы либо вернуть данные как есть, либо отсортировать их перед доставкой результата.
Ключ к моему вопросу заключается в том, что я хочу иметь возможность включать и выключать эту функцию, сохраняя при этом порядок данных впоследствии (при выполнении другой операции). Вот пример типичного потока событий:
- Пользователь открывает приложение, и база данных возвращает: «список 3», «список 1», «список 2».
- данные отображаются пользователю как есть (несортированные)
- Пользователь включает функцию сортировки
- Модель представления сортирует список поддержки локально
- Наблюдатель в действии получает отсортированный список
- Действие теперь показывает «список 1», «список 2», «список 3»
- Пользователь добавляет новый список: «список 4».
Прежде чем я перейду к проблемной части, вот код:
Репозиторий (сокращен для краткости):
class ListsRepository {
val db = Database().getInstance();
fun getAllUserLists(userId: Int): LiveData<List<UserList>>
}
Activity (сокращен для краткости):
class UserListsActivity: Activity() {
val viewModel: UserListsViewModel
val adapter: UserListAdapter
fun onCreate(savedInstanceState: Bundle?) {
viewModel.allLists.observe(this, Observer { newData ->
adapter.setData(newData)
adapter.notifyDataSetChanged()
)
}
}
Viewmodel (сокращено для краткости)
class UserListsViewModel(val userId: Int, val repository: ListsRepository ): ViewModel() {
val allLists = MediatorLiveData<List<UserList>>()
val isSorting = false
init {
allLists.addSource(repository.getAllUserLists(userId)) { userLists ->
val result = userLists
if(isSorting) {
result = result.sortedBy { it.name }
}
value = result
}
}
}
Теперь перейдем к самой проблеме:
Пока включена функция сортировки, все в порядке и пользователь увидит «список 1», «список 2», «список 3», «список 4».
Но теперь, допустим, пользователь отключает функцию сортировки и добавляет еще один список, «l ist 0 "
Теперь происходит следующее:
-
MediatorLiveData
получает обновление из базы данных как« список 3 »,« список 1 »,« список 2 »," список 4 "," список 0 "(исходный порядок в базе данных плюс новые списки) - Флаг
isSorting
выключен, поэтому он устанавливает значение для возвращаемых данных как есть - Данные отображаются пользователю без сортировки, но предыдущая сортировка теперь потеряна
Желаемый результат: «список 1», «список 2», «список 3», «список 4» , «список 0» (несортированный, но предыдущий порядок сохраняется)
Фактический результат: «список 3», «список 1», «список 2», «список 4», «список 0» (предыдущий сортировка списков 1,2,3 теперь потеряна).
Надеюсь, я ясно выразился. Можно ли этого добиться, не добавляя слишком много сложностей? Каков «стандартный способ» обеспечить функцию сортировки в приложении android?
Спасибо