简体   繁体   English

带视图寻呼机的Android MVP

[英]Android MVP with view pager

I am trying to implement MVP in my android project. 我想在我的android项目中实现MVP。 But I am getting difficulty when i implement MVP with viewPagerAdapter . 但是当我使用viewPagerAdapter实现MVP时,我遇到了困难。 To implement MVP, we used to create fragment/view and presenter instance in Activity class.Fragment/view and presenter both will communicate with each other using contract. 为了实现MVP,我们习惯在Activity类中创建片段/视图和演示者实例。片段/视图和演示者都将使用契约相互通信。 In this way, we decoupled view with presenter and cover all business logic with Unit test. 通过这种方式,我们将视图与演示者分离,并使用单元测试覆盖所有业务逻辑。 But in case when we have tablayout inside activity . 但是,如果我们有内部activity tablayout We have initiated fragments inside fragmentPagerAdapter . 我们在fragmentPagerAdapter启动了fragmentPagerAdapter I am not sure, how to provide tab-fragment/view reference to its corresponding presenter.If I initialize presenter inside fragmentPagerAdapter that would bleach SRP(Single responsibility principal). 我不确定,如何为其相应的演示者提供制表符片段/视图引用。如果我在fragmentPagerAdapter中初始化presenter,它将漂白SRP(单一责任主体)。 If we create presenter instance inside Fragment that would generate coupled code and then we don't need contact to establish communication between fragment and presenter. 如果我们在Fragment中创建将生成耦合代码的presenter实例,那么我们就不需要联系来建立片段和演示者之间的通信。 Please provide architectural solution, so that i can achieve same MVP with view pager along with adhering all clean code principal. 请提供架构解决方案,以便我可以使用视图寻呼机实现相同的MVP,同时遵守所有干净的代码主体。

For reference, please find below my adapter code, where i am initializing fragments for tab: 作为参考,请在下面找到我的适配器代码,我正在为选项卡初始化片段:

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

use it in 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);

Inject the presenters to the view pagers adapter is not enough. 将演示者注入视图寻呼机适配器是不够的。

if the activity gets killed and recreated the fragments inside the view pager are restored but the presenters not. 如果活动被杀死并重新创建,则视图寻呼机内的片段将被恢复,但演示者不会。

U will have to attach the presenters again ( which is a little hacky ) by iterating on the fragments inside the fragment managers and attach them the presenters. 你将不得不通过迭代片段管理器内的片段并将它们附加到演示者来再次附加演示者(这有点hacky)。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM