一个 "details" 片段中的两个 ViewModel

Two ViewModels in one "details" fragment

我有三个片段,第一个ListFragment它是一个Recyclerview包含firebase collection的所有文档,第二个FavoritesFragment它是Recyclerview的收藏夹用户从第一个 Recyclerview 中选择的项目。第三个 DetailsFragment 显示从这两个 recyclerviews 之一点击的项目的详细信息。我在我的应用程序中使用导航组件和 MVVM 架构。

我的问题是:我可以添加两个视图模型,一个用于 BlockListViewModel,一个用于 BlockListFavViewModel 到 onActivityCreated 中的 DetailsFragment 以从 firebase 获取 recyclerview 数据的适当位置,因为这段代码位于如果用户来自ListFragment,底部我可以获得正确的位置,如果用户来自FavoritesFragment,我可以获得错误的位置。

@Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);


        blockListViewModel = new ViewModelProvider(getActivity()).get(BlockListViewModel.class);
        blockListViewModel.getBlockListModelData().observe(getViewLifecycleOwner(), new Observer<List<BlockListModel>>() {
            @Override
            public void onChanged(List<BlockListModel> blockListModels) {

                Glide.with(getContext())
                        .load(blockListModels.get(position).getImage())
                        .centerCrop()
                        .placeholder(R.drawable.placeholder_image)
                        .into(detailsImage);

                matTXT.setText(blockListModels.get(position).getMat());
                finishedTXT.setText(blockListModels.get(position).getFinished());
                cutTXT.setText(blockListModels.get(position).getCut());
                assembleTXT.setText(blockListModels.get(position).getAssemble());

                blockId = blockListModels.get(position).getBlock_id();
                blockTitle = blockListModels.get(position).getName();
            }
        });
    }

如果您的项目要求使用视图模型,则无需使用两个视图模型。 然后,您可以通过从 ListFragment 和 FavoritesFragment 传递 veriable,在详细片段中单独使用 viewmodel, 如果从 ListFragment 打开片段,则将类名作为 TAG 发送,对于 FavoritesFragment 也是如此,并在 detailFragment 中检查是否可验证, 基于该变量使用 viewmodel。

在这里,我将分享您如何在代码中实现的编码部分

从 ListFragment 调用 DetailFragment :

DetailFragment detailFrm = new DetailFragment();
Bundle args = new Bundle();
args.putString("OpenFrom", "ListFragment");
detailFrm.setArguments(args);
getFragmentManager().beginTransaction().add(R.id.container, detailFrm).commit();

从 FavoritesFragment 调用 DetailFragment :

DetailFragment detailFrm = new DetailFragment();
Bundle args = new Bundle();
args.putString("OpenFrom", "FavoritesFragment");
detailFrm.setArguments(args);
getFragmentManager().beginTransaction().add(R.id.container, detailFrm).commit();

在DetailFragment

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
String value = getArguments().getString("OpenFrom");
if(value.equals("ListFragment"){

//use First Viewmodel
        blockListViewModel = new ViewModelProvider(getActivity()).get(BlockListViewModel.class);
        blockListViewModel.getBlockListModelData().observe(getViewLifecycleOwner(), new Observer<List<BlockListModel>>() {
            @Override
            public void onChanged(List<BlockListModel> blockListModels) {

                Glide.with(getContext())
                        .load(blockListModels.get(position).getImage())
                        .centerCrop()
                        .placeholder(R.drawable.placeholder_image)
                        .into(detailsImage);

                matTXT.setText(blockListModels.get(position).getMat());
                finishedTXT.setText(blockListModels.get(position).getFinished());
                cutTXT.setText(blockListModels.get(position).getCut());
                assembleTXT.setText(blockListModels.get(position).getAssemble());

                blockId = blockListModels.get(position).getBlock_id();
                blockTitle = blockListModels.get(position).getName();
            }
        });
        }else if(value.equals("FavoritesFragment"){
        
          //use Other Viewmodel     
        }
    }

有什么问题可以问我