Как добавить новый элемент в комнату (ORM) с помощью LiveData и отобразить его как первый элемент в RecyclerView - PullRequest
0 голосов
/ 02 сентября 2018

Я использую Room Persistent Data от Android, чтобы хранить данные, поступающие с сервера - локально. Кроме того, я использую шаблон MVVM, рекомендованный официальными документами Android, таким образом, мой recyclerView отображается в обозревателе LiveData примерно так:

@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.activity_feed, container, false);

    ((App)getActivity().getApplication()).getmAppComponent().inject(this);

    rvFeed = view.findViewById(R.id.rvFeed);
    mLinearLayoutManager = new LinearLayoutManager(getActivity());
    rvFeed.setLayoutManager(mLinearLayoutManager);
    feedAdapter = new FeedAdapter(this);
    feedAdapter.setRV(rvFeed);

    mFactory = new PostsViewModelFactory(postRepository);
    mViewModel = ViewModelProviders.of(this, mFactory).get(PostsViewModel.class);
    mViewModel.init();
    mViewModel.getPostsLiveData().observe(this, new Observer<List<Post>>() {
        @Override
        public void onChanged(@Nullable List<Post> posts) {

            feedAdapter.setPostsList(posts);

            if (firstLaunch) {
                rvFeed.setAdapter(feedAdapter);
                firstLaunch = false;
            }
            loading = true;
        }
    });
    return view;
} 

mViewModel.getPostsLiveData() в основном воспроизводит LiveData из комнаты (через репозиторий), таким образом, любые новые данные, добавленные в Room, запускают LiveData Observer, а feedAdapter заполняет представление recyclerView (то есть setPostsLists(), которое в ответ вызывает notifyDataSetChanged()).

Но, как вы можете заметить, новые свежие данные, добавленные в комнату, не будут отображаться как первый элемент в recyclerView, поскольку они не добавляются непосредственно в адаптер [следовательно, я не могу вызвать notifyItemInserted(0)], а скорее в комнату (местное хранилище).

Итак, мой вопрос, каков наилучший способ добавить в локальное хранилище (Комната), но в дополнение к тому, чтобы заставить элемент отображаться как первый в программе recyclerView, когда он заполняется, когда активируется получение наблюдателя LiveData?

Заранее спасибо:)

...