一个 "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
}
}
有什么问题可以问我
我有三个片段,第一个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
}
}
有什么问题可以问我