Я внедряю новую библиотеку подкачки с RecyclerView с приложением, созданным на основе Компоненты архитектуры.
Данные для заполнения списка берутся из базы данных Room. Фактически, он извлекается из сети, сохраняется в локальной базе данных и передается в список.
Чтобы предоставить необходимые данные для построения списка, я реализовал свой собственный PageKeyedDataSource. Все работает как положено, за исключением одной маленькой детали. Если после отображения списка происходит какое-либо изменение данных элемента строки списка, он не обновляется автоматически. Итак, если, например, в моем списке отображается список элементов с полем name, и внезапно это поле обновляется в локальной базе данных Room для определенного элемента строки, список не обновляет строка UI автоматически.
Такое поведение происходит только при использовании настраиваемого источника данных, в отличие от случая, когда источник данных получается автоматически из DAO, напрямую возвращая DataSource Factory . Однако мне нужно реализовать собственный источник данных.
Я знаю, что его можно обновить, вызвав метод invalidate () в DataSource, чтобы восстановить обновленный список. Однако, если приложение показывает 2 списка одновременно (например, половина экрана каждый), и этот элемент отображается в обоих списках, потребуется вызвать invalidate () для обоих списков отдельно.
Я подумал о решении, в котором вместо использования экземпляра класса элемента для заполнения каждого ViewHolder, он использует LiveData a > обернутую его версию, чтобы каждая строка отслеживала изменения в своем собственном элементе и при необходимости обновляла пользовательский интерфейс этой строки. Тем не менее, я вижу в этом подходе некоторые недостатки:
- Должен быть LifeCycleOwner (например, фрагмент, содержащий RecyclerView). передается в PagedListAdapter, а затем перенаправляет его в ViewHolder для наблюдения обернутый элемент LiveData.
- Новый наблюдатель будет зарегистрирован для каждой новой строки списка, поэтому я вообще не знаю, имеет ли он чрезмерные вычислительные затраты и затраты на память, учитывая, что это будет сделано для каждого списка в приложении, в котором много списков.
- Поскольку LifeCycleOwner, наблюдающий за обернутым элементом LiveData, будет, например, фрагментом, содержащим RecyclerView, вместо самого ViewHolder, наблюдатель будет уведомляться каждый раз, когда происходит изменение этого элемента, даже если строка, содержащая этот элемент, даже не видимый в этот момент, потому что список был прокручен, что мне кажется пустой тратой ресурсов, которая может излишне увеличить вычислительные затраты.
Я вообще не знаю, может ли это, даже с учетом этих недостатков, показаться приличным подходом или, может быть, кто-нибудь из вас знает какой-либо другой более чистый и лучший способ справиться с этим.
Заранее спасибо.