Viewpager 未正确重绘内容 索引越界异常:索引 3 无效,大小为 2



我正在开发具有四个页面滑块的Android应用程序。我有一个包含查看页和四个片段的活动。当我第二次打开幻灯片时,它只加载四张幻灯片中的前两张,并且 showX 索引无效错误。我使用了fragmentstatepageradapter,因为我的幻灯片有很多图片。 具有自定义适配器的活动类。

public class AddKeyActivity extends FragmentActivity
implements ViewPager.OnPageChangeListener, RadioGroup.OnCheckedChangeListener{
private static final int NUMBER_OF_PAGES = 4;
private RadioGroup radioGroup;
ViewPager pager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_key);
pager = (ViewPager) findViewById(R.id.pager);
pager.setAdapter(new MyPagerAdapter(getSupportFragmentManager()));
pager.addOnPageChangeListener(this);
radioGroup = (RadioGroup)findViewById(R.id.radiogroup);
radioGroup.setOnCheckedChangeListener(this);
}
@Override
public void onPageScrolled(int position, float v, int i) {
}
@Override
public void onPageSelected(int position) {
switch(position) {
case 0:
radioGroup.check(R.id.radioButton1);
break;
case 1:
radioGroup.check(R.id.radioButton2);
break;
case 2:
radioGroup.check(R.id.radioButton3);
break;
case 3:
radioGroup.check(R.id.radioButton4);
break;
default:
radioGroup.check(R.id.radioButton1);
}
}
@Override
public void onPageScrollStateChanged(int position) {
}
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch(checkedId) {
case R.id.radioButton1:
pager.setCurrentItem(0);
break;
case R.id.radioButton2:
pager.setCurrentItem(1);
break;
case R.id.radioButton3:
pager.setCurrentItem(2);
break;
case R.id.radioButton4:
pager.setCurrentItem(3);
break;
}
}
private class MyPagerAdapter extends FragmentStatePagerAdapter {
public MyPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch(position) {
case 0:
return FirstSlide.newInstance("FirstSlide, Instance 1");
case 1:
return SecondSlide.newInstance("SecondSlide, Instance 1");
case 2:
return ThirdSlide.newInstance("ThirdSlide, Instance 1");
case 3:
return FourthSlide.newInstance("FourthSlide, Instance 1");
default:
return FirstSlide.newInstance("FirstSlide, Default");
}
}
@Override
public int getCount() {
return NUMBER_OF_PAGES;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
notifyDataSetChanged();
}
}
}

我调试我的应用程序,并将回答我自己的问题。 更正是

public Fragment getItem(int position) {
switch(position) {
case 0:
return FirstSlide.newInstance("FirstSlide, Instance 1");
case 1:
return SecondSlide.newInstance("SecondSlide, Instance 1");
case 2:
return ThirdSlide.newInstance("ThirdSlide, Instance 1");
case 3:
return FourthSlide.newInstance("FourthSlide, Instance 1");
default:
return FirstSlide.newInstance("FirstSlide, Default");
}
}

换成

public Fragment getItem(int position) {
switch(position) {
case 0:
return new FirstSlide();
case 1:
return new SecondSlide();
case 2:
return new ThirdSlide();
case 3:
return new FourthSlide();
default:
return new FirstSlide();
}
}

代码现在工作正常滑块工作正常。任何人都可以解释更多

最新更新