Представьте себе список постов (например, Facebook), представленных вам в Главном действии. Основополагающим «единственным источником правды» является база данных, а комната Android используется для получения и наблюдения этого списка сообщений.
Вот как я наблюдаю за данными (детали опущены из-за проблем с лицензией и краткости):
faViewModel = ViewModelProviders.of(getActivity()).get(FAViewModel.class);
faViewModel.getAllPosts().observe(getActivity(),
newPosts - > {
if (newPosts != null && newPosts.size() > 0) {
postsLoadingProgressBar.setVisibility(View.INVISIBLE);
}
// if ((posts == null) || newPosts.get(0).getId() != posts.get(0).getId()) {
// Update the cached copy of the posts in the adapter.
posts = newPosts;
mPostsAdapter = new PostsAdapter(this.getChildFragmentManager(), newPosts);
mViewPager.setAdapter(mPostsAdapter);
// }
});
faViewModel.fetchNextData(currentPage);
Теперь к каждому сообщению также прикреплена кнопка «Мне нравится», а также общее количество лайков, полученных за одно сообщение.
Теперь пользователь нажимает кнопку «Мне нравится», и вы отправляете действие. Это действие может сделать следующее:
1.1 Выпустить запрос на обновление, который увеличивает количество лайков , полученное сообщением.
1.2 Отметьте, что этот конкретный пост в базе данных понравился пользователю.
- На самом деле отправьте POST-запрос на сервер и обновите там артефакты. (Всего лайков и сообщений, которые понравились этому пользователю, между прочим.)
Шаг 2 выполнимый, поэтому давайте не будем об этом. Однако шаги 1.1 и 1.2 сложны, потому что, когда я запускаю свой запрос на обновление:
@Query("UPDATE post SET liked= :liked, likes = likes + 1 WHERE id= :id")
void updateLike(int id, int liked);
(Примечание. Это не относится к неприязням. Работает как средний. Пользователь может дать N лайков одному сообщению.)
В любом случае, когда я запускаю этот запрос, он обновляет базу данных. Поскольку я на самом деле наблюдаю за этой базой данных, используя LiveData
, я получаю новую сущность LiveData, которую затем присоединяю к адаптеру. Мой адаптер думает (и правильно думает), что набор данных изменил , и, следовательно, он обновляет список. При этом он также прокручивает до первого поста в списке. ЭТО ПРОБЛЕМА .
Как я могу предотвратить это?
Одним из возможных решений является проверка того, совпадают ли идентификаторы записей входящего и текущего списка, не обновляйте. Однако это означает, что я не буду получать обновленные No of likes
и другие вещи из БД. Это, в свою очередь, означало бы, что когда пользователь нажимает кнопку «Мне нравится», мне нужно вручную изменить No of likes
и состояние рисованного объекта «Мне нравится» В ВИДЕ .
Это правильный подход? Или есть что-то, что я могу сделать, чтобы моя база данных оставалась « единственным источником истины », при этом сохраняя возможность кнопки «Мне нравится».
Любые другие идеи / хаки приветствуются.