【问题标题】:Two ViewModels in one "details" fragment一个“详细信息”片段中的两个 ViewModel
【发布时间】:2020-06-29 05:13:57
【问题描述】:

我有三个片段,第一个 ListFragment 它是一个 Recyclerview 包含 firebase 集合的所有文档,第二个 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();
            }
        });
    }

【问题讨论】:

  • 是什么让你认为你只能拥有一个 ViewModel?
  • @ianhanniballake 因为我是 android 新手 :) .. 但我的问题是,如果用户来自特定片段,我如何使用特定视图模型,如果用户来自第二个片段,我如何使用其他视图模型.谢谢

标签: java android mvvm android-recyclerview android-jetpack


【解决方案1】:

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

从 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     
        }
    }

有什么问题可以问我。

【讨论】:

  • 谢谢@webaddicted,它可以工作,我在传递 OpenFrom 值时做了一点改动,因为我在我的应用程序中使用了导航组件。
【解决方案2】:

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

【讨论】:

  • 这是我想要的,请你告诉我如何以编程方式进行操作,谢谢!
猜你喜欢
  • 2014-07-23
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
  • 2015-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多