Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何推动ViewModelProvider.Factory?_Java_Android_Viewmodel_Android Architecture Components_Android Jetpack - Fatal编程技术网

Java 如何推动ViewModelProvider.Factory?

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实现作为第二个参数。

我想在片段的onViewCreated方法中访问ViewModel类(它扩展了AndroidViewModel)。下面的代码行应该像上面所说的那样工作。但事实并非如此

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()
而不是使用
这个
。你说它不起作用是什么意思?你有错误吗?