Android MVP与视图翻页器

7
我正在尝试在我的Android项目中实现MVP。但是当我使用viewPagerAdapter时,实现MVP变得困难。为了实现MVP,我们需要在Activity类中创建片段/视图和Presenter实例。片段/视图和Presenter之间通过契约进行通信。这样,我们将视图与Presenter解耦,并使用单元测试覆盖所有业务逻辑。但是,在activity中有tablayout的情况下,我们已经初始化了fragmentPagerAdapter中的片段。我不确定如何将选项卡片段/视图引用提供给相应的Presenter。如果我在fragmentPagerAdapter中初始化presenter,那么就会违反SRP(Single responsibility principal)。如果我们在片段/视图中创建Presenter实例,则会生成耦合代码,然后我们不需要contact来建立片段/视图和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;
        }
    }  
2个回答

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

0

仅将Presenter注入ViewPager的适配器是不够的。

如果Activity被销毁并重新创建,ViewPager内部的Fragment会被恢复,但Presenter不会。

您需要再次附加Presenter(这有点hacky),通过迭代Fragment Manager中的Fragment并将它们附加到Presenter上。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接