Это правильный способ использовать структуру MVVM с ViewModel и RecyclerView без каких-либо проблем? - PullRequest
0 голосов
/ 12 апреля 2020

Итак, у меня есть действие, содержащее 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?

1 Ответ

1 голос
/ 13 апреля 2020
  1. Наблюдайте за моделью представления в onViewCreated во фрагменте.

Причина -> вы обновляете пользовательский интерфейс, когда происходят изменения в модели представления. Вы можете добавить cra sh, если заполняете представление данными из viewmodel, если элемент представления еще не создан.

Лучше иметь отдельный экземпляр модели представления для каждого фрагмента.

Причина -> Если у вас есть только один экземпляр модели представления в действии, передача их фрагментам не будет идеально, так как будет сложнее, когда вы добавите больше фрагментов.

Init можно вызывать из разных мест в зависимости от типа выполняемых задач. В вашем случае onViewCreated должен быть в порядке.

причина -> В вашем случае init выбирает данные из репозитория. Как только данные извлекаются, ваш recyclerview вступит в игру. Вы не хотите играть с элементами представления в OnCreateView

ArrayList<Book> bookList в RecyclerView не обязательно должны быть liveata.

Причина -> Livedata предназначена для связи между представлением (Activity / Fragment) и Viewmodel. После того, как ваша жилатата была обнаружена данным видом, вам больше не нужно обрабатывать ее как жилататы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...