Java 如何推动ViewModelProvider.Factory?
我想在片段的onViewCreated方法中访问ViewModel类(它扩展了AndroidViewModel)。下面的代码行应该像上面所说的那样工作。但事实并非如此Java 如何推动ViewModelProvider.Factory?,java,android,viewmodel,android-architecture-components,android-jetpack,Java,Android,Viewmodel,Android Architecture Components,Android Jetpack,我想在片段的onViewCreated方法中访问ViewModel类(它扩展了AndroidViewModel)。下面的代码行应该像上面所说的那样工作。但事实并非如此 ProductListViewModel viewModel = new ViewModelProvider(this).get(ProductListViewModel.class); 显然,ViewModelProvider构造函数最近已经更改。它需要一个ViewModelProvider.Factory实现作为第二个参数。
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);
}
});
}
}
公共类HomeFragment扩展了片段{
私有HomeListAdapter HomeListAdapter;
公共HomeFragment(){
//必需的空公共构造函数
}
公共静态HomeFragment newInstance(){
返回新的HomeFragment();
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
}
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
视图=充气机。充气(R.layout.fragment\u home,container,false);
homeListAdapter=新的homeListAdapter(getContext());
RecyclerView homeRecyclerView=view.findViewById(R.id.rv_产品);
setAdapter(homeListAdapter);
setLayoutManager(新的LinearLayoutManager(getContext());
返回视图;
}
@凌驾
已创建公用void onview(@NonNull视图,@Nullable Bundle savedInstanceState){
super.onViewCreated(视图,savedInstanceState);
ProductListViewModel viewModel=新的ViewModelProvider(this.get)(ProductListViewModel.class);
viewModel.getAllProducts().observe(这个,新的观察者(){
@凌驾
更改后的公共作废(列出产品){
homeListAdapter.setProducts(产品);
}
});
}
}
这是我的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);
}
}
公共类ProductListViewModel扩展了AndroidViewModel{
私人产品储存库;
私有LiveData产品;
public ProductListViewModel(@NonNull应用程序){
超级(应用);
mRepository=新产品存储库(应用程序);
mAllProducts=mRepository.getAllProducts();
}
公共LiveData getAllProducts(){
退货;
}
公开作废插入(产品){
mRepository.insert(产品);
}
}
更新至androidx的最新v2.2.0。生命周期:生命周期扩展库,您应该能够使用ViewModelProvider,而不使用factory参数,该参数为您创建默认工厂。当使用匕首或剑柄进行依赖项注入时,需要创建即时消息,这非常方便。如果出于测试目的需要,我建议使用Hilt进一步删除工厂创建的样板代码。因为您是从片段中观察LiveData,所以应该尝试将observe()
语句的第一个参数切换为getViewLifecycleOwner()
而不是使用这个
。你说它不起作用是什么意思?你有错误吗?