看一下这段代码:
@Override
public Fragment getItem(int index){
Log.i("Tab position", String.valueOf(index));
switch (index) {
case 0:
// Top Rated fragment activity
return new TopRatedFragment();
case 1:
// Games fragment activity
return new GamesFragment();
case 2:
// Movies fragment activity
return new MoviesFragment();
}
return null;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return 3;
}
ViewPager
工作正常,但如何?
当我启动我的应用程序时,我会使用TabPosition 0和1来跟踪Logcat:
09-16 15:28:20.353: I/Tab position(2737): 0
09-16 15:28:20.372: I/Tab position(2737): 1
现在,当我选择第二个标签或滑动到第二个页面时,我会使用TabPosition 2跟踪Logcat:
09-16 15:28:29.072: I/Tab position(2737): 2
当我选择第三个标签或滑动到第三页时,没有Logcat和TabPosition没有打印:
我的困惑是我知道getItem()
返回的索引不是当前所选页面或制表符的位置,但它是需要呈现的页面位置。
但是如果是这种情况那么switch语句如何返回正确的片段虽然索引不正确。
例如:
最初由getItem()
0和1返回两个索引,现在switch语句决定如何选择0或1.
我希望你理解问题。
答案 0 :(得分:1)
它的工作原理如下:
当您设置适配器时,ViewPager将要求适配器显示第一个片段(索引0)和右侧(索引1)。
这是因为ViewPager总是缓存除了当前显示的页面之外的一些页面。 " some"的默认值是1但你可以用
更改它注意0没有左邻居(索引-1),所以在开头只加载索引0和1。
现在,当您将页面索引为1时,ViewPager已在其缓存中具有相应的片段,并且可以立即显示它。但它也会向适配器询问索引2,因为它将是下一个。
同样,当您翻页到索引2时,它已经有了片段并且可以显示它。由于2没有正确的邻居(ViewPager从你的getCount中知道),没有什么可以加载......
编辑:所以,更直接地回答你的原始问题:switch语句永远不必在0和1之间做出决定。对于0调用一次getItem,对于1调用一次,它在每种情况下返回相应的片段,然后返回ViewPager决定显示哪些。