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