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项,最后一个?
答案 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。您可以使用此方法而不是手动设置当前项目。