Android 具有视图寻呼机的 MVP

Android MVP with view pager

我正在尝试在我的 android 项目中实施 MVP。但是当我用 viewPagerAdapter 实现 MVP 时,我遇到了困难。为了实现 MVP,我们曾经在 Activity class.Fragment/view 中创建 fragment/view 和 Presenter 实例,并且 Presenter 都将使用契约相互通信。通过这种方式,我们将 View 与 Presenter 解耦,并通过单元测试覆盖所有业务逻辑。但是如果我们在 activity 中有 tablayout。我们在 fragmentPagerAdapter 内启动了片段。我不确定,如何提供对其相应 presenter.If 的 tab-fragment/view 引用我在 fragmentPagerAdapter 中初始化演示者,这会漂白 SRP(单一责任主体)。如果我们在 Fragment 中创建将生成耦合代码的演示器实例,那么我们不需要联系来建立片段和演示器之间的通信。请提供架构解决方案,以便我可以使用视图寻呼机实现相同的 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);
        }
    }

在activity中使用:

    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);

将演示者注入视图寻呼机适配器是不够的。

如果 activity 被杀死并重新创建,视图寻呼机内的片段将被恢复,但演示者不会。

您将不得不通过迭代片段管理器中的片段并将它们附加到演示者来再次附加演示者(这有点老套)。

  Fragment fragment = getChildFragmentManager().findFragmentByTag("android:switcher:" 
  + mViewPager.getId() + ":" + {*position*});
    ((YourFragment)fragment).setPresenter(presenter)