Итак, у меня есть действие, содержащее 2 фрагмента, репозиторий и класс ViewModel, поскольку я следую android руководству разработчика по использованию структуры 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;
}
Представление 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) Правильно ли я использую это? Должен ли я использовать объект viewModel в onActivityCreated () или в другом месте, чтобы предотвратить какие-либо ошибки?
2) Должен ли я использовать экземпляр viewModel в каждом фрагменте или использовать его в действии, которое содержит их все, а затем передать его каждому фрагменту по параметрам?
3) Где находится правильное место для вызова init()
(метод для получения всех книг в базе данных) в первый раз, чтобы пользователь увидел книгу список, сохраненный в базе данных при открытии приложения?
4) Должен ли класс ArrayList<Book> bookList;
in MyRecyclerView
быть также LiveData / MutableData?