有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    1. 观察片段中onViewCreated中的viewModel

    原因;当Viewmodel发生更改时,您的用户界面正在更新。如果尚未实例化视图元素,则使用viewmodel中的数据填充视图,可能会遇到崩溃

    1. 最好为每个片段提供一个单独的viewmodel实例

    原因;如果活动中只有一个viewmodel实例,那么将它们传递给片段并不理想,因为添加更多片段时会变得复杂

    1. Init可以从不同的位置调用,具体取决于它执行的任务类型。在您的情况下,onViewCreated应该很好

    原因;在您的例子中,您的init正在从存储库中获取数据。一旦数据被提取出来,你的recyclerview就会发挥作用。您不想在OnCreateView中使用视图元素

    1. ArrayList<Book> bookList中的{}不必是livedata

    原因;Livedata用于视图(活动/片段)和Viewmodel之间的通信。一旦视图观察到了livedata,就不需要再将其视为livedata