我想在我的 Fragment 的 onViewCreated 方法中访问 ViewModel 类(它扩展了 AndroidViewModel)。下面的代码行应该像 android 文档 所说的那样工作。但事实并非如此!
ProductListViewModel viewModel = new ViewModelProvider(this).get(ProductListViewModel.class);
显然,ViewModelProvider 构造函数最近已更改。它需要一个 ViewModelProvider.Factory 实现作为第二个参数。为什么需要 ViewModelProvider.Factory 实现,应该怎么做?
这是我的片段类:
public class HomeFragment extends Fragment {
private HomeListAdapter homeListAdapter;
public HomeFragment() {
// Required empty public constructor
}
public static HomeFragment newInstance() {
return new HomeFragment();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_home, container, false);
homeListAdapter = new HomeListAdapter(getContext());
RecyclerView homeRecyclerView = view.findViewById(R.id.rv_products);
homeRecyclerView.setAdapter(homeListAdapter);
homeRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
return view;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
ProductListViewModel viewModel = new ViewModelProvider(this).get(ProductListViewModel.class);
viewModel.getAllProducts().observe(this, new Observer<List<Product>>() {
@Override
public void onChanged(List<Product> products) {
homeListAdapter.setProducts(products);
}
});
}
}
这是我的 ViewModel:
public class ProductListViewModel extends AndroidViewModel {
private ProductRepository mRepository;
private LiveData<List<Product>> mAllProducts;
public ProductListViewModel(@NonNull Application application) {
super(application);
mRepository = new ProductRepository(application);
mAllProducts = mRepository.getAllProducts();
}
public LiveData<List<Product>> getAllProducts() {
return mAllProducts;
}
public void insert(Product product) {
mRepository.insert(product);
}
}
因为 ViewModelProvider 不知道 ViewModel 是如何注入构造函数的。
你必须实现接口
ViewModelProvider.AndroidViewModelFactory
在科特林中:
class MyAndroidViewModel(application: Application) : AndroidViewModel(application)
class MyViewModelFactory(application: Application) :
ViewModelProvider.AndroidViewModelFactory(application)
class MyActivity : Activity() {
val viewModel = MyViewModelFactory(this.application).create(MyAndroidViewModel::class.java)
}
AndroidViewModel 提供应用程序上下文,这对 单元测试。单元测试不应处理任何 Android 生命周期,例如上下文。