这是将 MVVM 结构与 ViewModel 和 RecyclerView 一起使用而没有任何问题的正确方法吗?
Is this the right way to use MVVM structure with ViewModel and RecyclerView without any issues?
所以我有一个 activity 包含 2 个片段、一个存储库和一个 ViewModel class 因为我遵循 android 开发人员指南使用 MVVM 结构。到目前为止它似乎有效,但我不确定在实施时我是否遵循了良好的做法。到目前为止它看起来像这样:
存储库class:
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
}
...
}
视图模型class:
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;
}
显示图书列表的 Recycler 视图:
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的实例,还是应该在包含它们的activity中使用它,然后通过参数将它传递给每个片段?
3) 第一次调用init()
(获取数据库中所有图书的方法)的正确位置在哪里,所以用户在app启动时看到的是数据库中存储的图书列表打开了吗?
4) MyRecyclerView
class 中的 ArrayList<Book> bookList;
也应该是 LiveData/MutableData 吗?
- 在Fragment中观察
onViewCreated
中的viewModel。
原因 -> 当 Viewmodel 发生变化时,您正在更新 UI。如果您在视图元素尚未实例化的情况下使用视图模型中的数据填充视图,则可能会遇到崩溃。
- 每个片段最好有一个单独的视图模型实例。
原因 -> 如果在 activity 中只有一个视图模型实例,将它们传递给片段并不理想,因为添加更多时它会变得复杂碎片。
Init
可以根据其执行的任务类型从不同的地方调用。在你的情况下,onViewCreated 应该是好的。
原因->在你的情况下,你的init
正在从repository.Once获取数据,你的recyclerview
会来发挥作用。你不想玩 OnCreateView
中的视图元素
ArrayList<Book> bookList
in RecyclerView
不必是实时数据。
原因-> Livedata用于视图(Activity/Fragment)和Viewmodel之间的通信。一旦您的实时数据被视图观察到,您就不需要再将其视为实时数据。
所以我有一个 activity 包含 2 个片段、一个存储库和一个 ViewModel class 因为我遵循 android 开发人员指南使用 MVVM 结构。到目前为止它似乎有效,但我不确定在实施时我是否遵循了良好的做法。到目前为止它看起来像这样:
存储库class:
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
}
...
}
视图模型class:
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;
}
显示图书列表的 Recycler 视图:
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的实例,还是应该在包含它们的activity中使用它,然后通过参数将它传递给每个片段?
3) 第一次调用init()
(获取数据库中所有图书的方法)的正确位置在哪里,所以用户在app启动时看到的是数据库中存储的图书列表打开了吗?
4) MyRecyclerView
class 中的 ArrayList<Book> bookList;
也应该是 LiveData/MutableData 吗?
- 在Fragment中观察
onViewCreated
中的viewModel。
原因 -> 当 Viewmodel 发生变化时,您正在更新 UI。如果您在视图元素尚未实例化的情况下使用视图模型中的数据填充视图,则可能会遇到崩溃。
- 每个片段最好有一个单独的视图模型实例。
原因 -> 如果在 activity 中只有一个视图模型实例,将它们传递给片段并不理想,因为添加更多时它会变得复杂碎片。
Init
可以根据其执行的任务类型从不同的地方调用。在你的情况下,onViewCreated 应该是好的。
原因->在你的情况下,你的init
正在从repository.Once获取数据,你的recyclerview
会来发挥作用。你不想玩 OnCreateView
ArrayList<Book> bookList
inRecyclerView
不必是实时数据。
原因-> Livedata用于视图(Activity/Fragment)和Viewmodel之间的通信。一旦您的实时数据被视图观察到,您就不需要再将其视为实时数据。