Android 具有 MVP 的 TabLayout 片段

Android TabLayout Fragment with MVP

我正在实现一个 MVP 应用程序,其中视图是在活动中加载的片段。每个 Activity 有 1 个片段要显示。我必须更改我的实现并添加现在将显示片段的 TabLayout。我尝试了将片段传递给适配器的不同方法,但都使我的应用程序崩溃,而且我无法理解该错误。我的最后一次尝试是将一个片段数组列表(目前为 1 个)传递给适配器。在基础上,我正在关注 google samples MVP todo app,但我需要实现此选项卡布局。拜托,这是我的主要项目,我到处都找了,这是我最后的选择。

public class HomeActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        Toolbar mHomeToolbar = (Toolbar) findViewById(R.id.toolbar);    // Set to the corresponding Toolbar in the UI.
        setSupportActionBar(mHomeToolbar);

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);    // Set to the corresponding Drawer Layout in the UI.

        ActionBarDrawerToggle mToggle = new ActionBarDrawerToggle(this, mDrawerLayout, mHomeToolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        mDrawerLayout.addDrawerListener(mToggle);   // Set mToggle as Drawer's toggle button and listen to actions.
        mToggle.syncState();

        NavigationView mDrawerNavigationView = (NavigationView) findViewById(R.id.nav_view);    // Set the corresponding Navigation View in the UI.

        mDrawerNavigationView.setNavigationItemSelectedListener(this);  // Add listener on Navigation's items.

        HomeFragment homeFragment = (HomeFragment) getSupportFragmentManager().findFragmentById(R.id.Quests_Frame); // Set to corresponding Fragment View in the UI.

        if (homeFragment == null) {
            homeFragment = HomeFragment.newInstance();
            FragmentLoader.loadFragmentInActivity(getSupportFragmentManager(), homeFragment, R.id.Quests_Frame);    // Display fragment in Activity.
        }

        repo = QuestsRepository.getInstance(QuestsDataSource.getINSTANCE());
        mHomePresenter = new HomePresenter(repo , homeFragment);

        TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
        ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
        TabPagerAdapter adapter = new TabPagerAdapter(getSupportFragmentManager());
        adapter.addFragment(homeFragment);
        viewPager.setAdapter(adapter);

    }

适配器class:

public class TabPagerAdapter extends FragmentPagerAdapter {

    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final int tabCount = 3;

    public TabPagerAdapter(FragmentManager fragmentManager) {
        super(fragmentManager);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                mFragmentList.get(position);
            default:
                return null;
        }
    }

    public void addFragment(Fragment fragment) {
        mFragmentList.add(fragment);
    }

    @Override
    public int getCount() {
        return tabCount;
    }
}
  1. 对于您想实现的目标,您不会使用 FragmentLoader Class。删除它(仅适用于选项卡活动)。以及 getSupportFragmentManager 行。

  2. 首页Activity,tabLayout和Viewpager怎么设置,没问题。 删除 addFragment 行。 在 setAdapter 后添加:

    mTabLayout.setupWithViewPager(mViewPager);

  3. 在 tabPagerAdapter 中,只需在那里创建对象呈现器和片段。 在 getItem 方法中,案例 0,您可以:

    HomeFragment homeFragment = HomeFragment.newInstance(); homePresenter = new HomePresenter(repo, homeFragment); return homeFragment;

  4. 哦,在 TabPagerAdapter 中,您可以在那里传递 repo 参数以创建演示者。

希望我说清楚了。如果您有任何问题,请告诉我。