我想在我的android项目中实现MVP。但是当我用viewPagerAdapter
实现MVP时,我遇到了困难。为了实现MVP,我们曾经在Activity
类中创建片段/视图和演示者实例。片段/视图和演示者都将使用契约相互通信。通过这种方式,我们将视图与演示者分离,并使用单元测试覆盖所有业务逻辑。但是,如果我们在tablayout
内有activity
。我们在fragmentPagerAdapter
内发起了碎片。我不确定,如何为其相应的演示者提供制表符片段/视图引用。如果我在fragmentPagerAdapter
中初始化将导致SRP(单一责任主体)的演示者。如果我们在Fragment
中创建会生成耦合代码的presenter实例,那么我们就不需要联系来建立片段和演示者之间的通信。请提供架构解决方案,以便我可以使用视图寻呼机实现相同的MVP,同时遵守所有干净的代码主体。
作为参考,请在下面找到我的适配器代码,我正在为选项卡初始化片段:
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return getConfigurationsTabFragment();
case 1:
return UpdateTabFragment.newInstance();
case 2:
return ServiceTabFragment.newInstance();
default:
return null;
}
}
private class MyAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
public MyAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFragement(Fragment fragment){
mFragmentList.add(fragment);
}
}
在活动中使用它:
MyAdapter adapter = new MyAdapter(getChildFragmentManager());
Fragment fragment1 = EmptyFragment.newInstance("this is page 1");
Fragment fragment2 = EmptyFragment.newInstance("this is page 2");
presenter1.setxxx(fragment1);
presenter2.setxxx(fragment2);
adapter.addFragement(fragment1);
adapter.addFragement(fragment2);
viewPager.setAdapter(adapter);
将演示者注入视图寻呼机适配器是不够的。
如果活动被杀死并重新创建,则视图寻呼机内的片段将被恢复,但演示者不会。
你将不得不通过迭代片段管理器内的片段并将它们附加到演示者来再次附加演示者(这有点hacky)。
Fragment fragment = getChildFragmentManager().findFragmentByTag("android:switcher:"
+ mViewPager.getId() + ":" + {*position*});
((YourFragment)fragment).setPresenter(presenter)