我正在使用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中显示为第一个? >
预先感谢:)