ViewPager幻灯片正在跳过第一个和最后一个片段

时间:2016-09-19 17:57:12

标签: android android-fragments

Hy,我是Android开发应用程序的新手,我想使用带有tabLayout的视图Pager创建一个应用程序。我还有一个包含列表的片段,我想在每个页面上创建这个片段但是有不同的数据,取决于所选的选项卡。我几乎实现了这个,但我在viewPager页面创建时遇到了问题。我的ViewPagerAdapter提供了FragmentStatePagerAdapter,它看起来像这样:

public class ViewPagerAdapter extends FragmentStatePagerAdapter{
    static final int NUM_ITEMS = 7;


    public ViewPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        Log.e("new instance",position+"");
        Fragment fragment=null;

        switch (position)
        {
            case 0: fragment=new ChannelListFragment();
                Log.e("new instance ",position+"");
                break;
            case 1: fragment= new ChannelListFragment();
                Log.e("new instance ",position+"");

                break;
            case 2: fragment=new ChannelListFragment();
                Log.e("new instance ",position+"");

                break;
            case 3: fragment=new ChannelListFragment();
                Log.e("new instance ",position+"");

                break;
            case 4: fragment=new ChannelListFragment();
                Log.e("new instance ",position+"");

                break;
            case 5: fragment=new ChannelListFragment();
                Log.e("new instance ",position+"");

                break;
            case 6: fragment=new ChannelListFragment();
                Log.e("new instance ",position+"");

                break;

        }
        return fragment;
    }

    @Override
    public int getCount() {
        return NUM_ITEMS;
    }
}

在我的MainActivity中,我这样做:

 viewPager = (ViewPager) findViewById(R.id.pager);
        final ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());

        viewPager.setAdapter(adapter);

        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
        tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());

            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });

    }

问题在于刷页面:当活动首次创建时,在日志中我看到为第一页创建位置0和位置1,之后它为第二个标签创建位置2,为第三个标签创建位置3,4,第六个选项卡为5,6,最后一个选项卡不执行任何操作。滚动回来创建4,3,2,1,0并且没有为第一个片段创建任何内容。这会根据所选选项卡设置数据时影响应用程序的功能。 你可以帮我解决一下,以便寻呼机在一个页面上创建一个片段,包括第0项和第6项,最后一个?

1 个答案:

答案 0 :(得分:0)

        viewPager = (ViewPager) findViewById(R.id.pager);
        final ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());

        viewPager.setAdapter(adapter);
        tabLayout.setupWithViewPager(viewPager) // link the given ViewPager and this TabLayout together so that changes in one are automatically reflected in the other
        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));

    }

默认情况下,当前页面的任一侧都会创建并缓存,以便在用户向左或向右滚动当前页面时获得良好的用户体验。 在您的情况下,第一页加载时(第1页和第2页创建) 当您滑动到第2页时,1和2已经在内存中,因此只有页面向右,即第三页被加载,依此类推。

请访问link了解详情。

另外,tablayout提供了一种方便的方法setUpWithViewPager,用于链接viewpager和tablayout。您可以使用此方法而不是手动设置当前项目。