如何使用LiveData将新项目添加到Room(ORM)并将其显示为RecyclerView中的第一项

时间:2018-09-02 09:15:36

标签: android android-recyclerview android-room android-architecture-components android-livedata

我正在使用Android的“房间持久性数据”来本地存储来自服务器的数据。此外,我使用的是MVVM模式,这是Android官方文档推荐的模式,因此我的recyclerView会显示在LiveData Observer中,如下所示:

@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()正在通过存储库从Room中检索LiveData,因此,添加到Room的任何新数据都会触发LiveData Observer,而feedAdapter将重新填充recyclerView(即setPostsLists()反过来会调用notifyDataSetChanged())。

但是您会注意到,添加到房间的新数据不会在recyclerView中显示为第一项,因为它不会直接添加到适配器中[因此,我无法调用notifyItemInserted(0)],而是到Room(本地存储)。

所以我的问题是,添加到本地存储(房间)的最佳方法是什么,但是除了当LiveData观察器被触发时重新填充该项目时,还迫使该项目在recyclerView中显示为第一个? >

预先感谢:)

0 个答案:

没有答案