我正在研究Android的Model View Presenter

我已经看过许多教程和示例,但是似乎都没有演示如何给出片段参数。

让我举一个例子说明我的意思

BurgerListFragment

此片段显示了汉堡的RecyclerView。基础适配器包含代表汉堡的对象数组。

BurgerDetailFragment

当我们从BurgerListFragment单击汉堡时,此事件将传递给演示者,然后由该演示者传达回应该显示BurgerDetailFragment的视图。

但是,我们必须传递BurgerDetailFragment被单击的汉堡对象。

所以通常会是这样

public static BurgerDetailFragment newInstance(Burger burger){
 BurgerDetailFragment burgerDetailFragment = new BurgerDetailFragment();
 Bundle args = new Bundle();
 args.putParcelable(BURGER_KEY,burger);
 burgerDetailFragment.setArguments(args);
 return burgerDetailFragment;
}


但是,我的困惑来自演示者告诉BurgerListFragment显示BurgerDetailFragment,因为它从模型获取数据并提供给另一个视图,并且视图不应该与模型通信!

如有任何疑问,请通知我

注意1:在我的示例中,我知道两个片段彼此直接通信是不好的,但这仅用于此示例,实际上这是我第二天遇到的另一个问题!

最佳答案

我管理这类事情的方法是在模型中具有一个表示当前所选数据的值。

希望下图可以使您对我的意思有所了解:

android - Android MVP,我们应该如何为 fragment 提供参数?-LMLPHP

实际上,您大概会将您的Burger数据保留在本地数据库中。 BurgerListPresenter向模型询问要加载数据库的所有Burgers的列表。

当用户选择汉堡时,演示者将该数据放回模型中。例如,可以将其作为所选汉堡的ID存储在SharedPrefs中。

BurgerDetailsPresenter向模型询问当前选定的汉堡。该模型将检查SharedPrefs中当前汉堡的ID,然后从数据库中加载它。

这样,两个片段以及两个演示者都完全不知道彼此。

10-08 18:20