java这是将MVVM结构与ViewModel和RecyclerView结合使用的正确方法吗?
所以我有一个包含2个片段、一个存储库和一个ViewModel类的活动,因为我遵循安卓开发者指南使用MVVM结构。到目前为止,它似乎是有效的,但我不确定在实现时是否遵循了良好的实践。目前看来是这样的:
存储库类:
public class MyRepository{
...
private MutableLiveData<ArrayList<Book>> bookList;
public MyRepository(){
bookList= new MutableLiveData<>();
getBookList(); //method that uses retrofit to fill bookList, since it's empty at this point
}
...
}
ViewModel类:
public class BookViewModel extends ViewModel {
private MyRepository repository;
private LiveData<ArrayList<Book>> bookList;
public void init(){
repository = new MyRepository();
bookList = repository.getBookList();
};
public LiveData<ArrayList<Book>> getBookList() {
if (bookList== null) {
bookList= new MutableLiveData<>();
}
return bookList;
}
显示图书列表的回收器视图:
public class MyRecyclerView extends RecyclerView.Adapter<MyRecyclerView.MyViewHolder> {
Context context;
ArrayList<Book> bookList;
public MyRecyclerView(Context context) {
context = context;
bookList = new ArrayList<>();
}
public void setList(ArrayList<Book> list){
bookList= list;
notifyDataSetChanged();
}
...
}
片段1
public class Fragment1 extends Fragment {
....
@Nullable
@Override
public View onCreateView(...) {
....
recyclerview_adapter = new AdapterRecyclerView(Context);
myRecyclerView = (RecyclerView)view.findViewById(R.id.recycler_view);
myRecyclerView.setLayoutManager(new LinearLayoutManager((getActivity())));
myRecyclerView.setAdapter(recyclerview_adapter);
viewModel.getbookList().observe(getViewLifecycleOwner(), new Observer<ArrayList<Producto>>() {
@Override
public void onChanged(ArrayList<Producto> books) {
recyclerview_adapter.setList(viewModel.getbookList().getValue());
}
});
return view;
}
...
}
问题:
1)我是否正确使用了这个?我应该在onActivityCreated()或其他地方使用viewModel对象来防止任何错误吗
2)我应该在每个片段中使用viewModel的实例,还是应该在包含它们的活动中使用它,然后通过参数将其传递给每个片段
3)第一次调用init()
(获取数据库中所有图书的方法)的正确位置在哪里,这样用户在打开应用程序时可以看到存储在数据库中的图书列表
4)类中的ArrayList<Book> bookList;
也应该是LiveData/MutableData吗
# 1 楼答案
onViewCreated
中的viewModel李>原因;当Viewmodel发生更改时,您的用户界面正在更新。如果尚未实例化视图元素,则使用viewmodel中的数据填充视图,可能会遇到崩溃
原因;如果活动中只有一个viewmodel实例,那么将它们传递给片段并不理想,因为添加更多片段时会变得复杂
Init
可以从不同的位置调用,具体取决于它执行的任务类型。在您的情况下,onViewCreated应该很好李>原因;在您的例子中,您的
init
正在从存储库中获取数据。一旦数据被提取出来,你的recyclerview
就会发挥作用。您不想在OnCreateView
中使用视图元素ArrayList<Book> bookList
中的{原因;Livedata用于视图(活动/片段)和Viewmodel之间的通信。一旦视图观察到了livedata,就不需要再将其视为livedata