英文:
Two ViewModels in one "details" fragment
问题
我有三个片段,第一个是ListFragment
,它是一个包含了 Firebase 集合中所有文档的 Recyclerview
,第二个是FavoritesFragment
,它是用户从第一个Recyclerview
中选择的收藏项的Recyclerview
。第三个是DetailsFragment
,用于显示从这两个Recyclerview
中的其中一个点击的项目的详细信息。我在应用程序中使用了导航组件和 MVVM 架构。
我的问题是:我是否可以在DetailsFragment
中的onActivityCreated
方法中添加两个 ViewModel,一个用于 BlockListViewModel
,另一个用于 BlockListFavViewModel
,以便根据需要获取来自 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();
}
});
}
英文:
I have three fragments, the first ListFragment
it's a Recyclerview
contains all documents of firebase collection, the second FavoritesFragment
it's Recyclerview
of favorites items chosen by the user from the first Recyclerview
. and the third DetailsFragment
that shows the details of the item that clicked from one of this two recyclerviews. i use navigation component in my app, and MVVM architecture.
My question is: can i add two viewmodels, one for BlockListViewModel and one for BlockListFavViewModel to DetailsFragment
in onActivityCreated
to get the appropriate position of recyclerview data from firebase, because with this code at the bottom i can get the correct position if the user comes from the ListFragment
, and wrong if user comes from 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();
}
});
}
答案1
得分: 0
不需要使用两个ViewModel,如果您的项目要求使用两个ViewModel。然后,您可以通过从ListFragment和FavoritesFragment传递变量来在详细Fragment中分别使用ViewModel。
如果从ListFragment打开片段,请将类名作为TAG发送,对于FavoritesFragment也是如此,在detailFragment中检查该变量,
根据该变量使用ViewModel。
英文:
There is no need of use two viewmodel, if this is requirement of you're project to use to view model.
Then you can seperate use of viewmodel in detail fragment by passing veriable from ListFragment and FavoritesFragment,
If fragment open from ListFragment then send classname as TAG, same for FavoritesFragment, and in detailFragment check that veriable,
on the bases of that variable use viewmodel.
答案2
得分: 0
以下是你的代码翻译部分:
从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")) {
// 使用第一个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")) {
// 使用其他ViewModel
}
}
如果你有任何疑问,可以问我。
英文:
Here I'm sharing coding part how you implement in your code
Call DetailFragment From ListFragment :
DetailFragment detailFrm = new DetailFragment();
Bundle args = new Bundle();
args.putString("OpenFrom", "ListFragment");
detailFrm.setArguments(args);
getFragmentManager().beginTransaction().add(R.id.container, detailFrm).commit();
Call DetailFragment From FavoritesFragment :
DetailFragment detailFrm = new DetailFragment();
Bundle args = new Bundle();
args.putString("OpenFrom", "FavoritesFragment");
detailFrm.setArguments(args);
getFragmentManager().beginTransaction().add(R.id.container, detailFrm).commit();
In 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
}
}
If you have any query you can ask me.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论