【发布时间】:2020-04-22 23:37:06
【问题描述】:
我正在使用 viewpager 来显示图片。我基本上只需要三个片段:要预览的上一个图像、当前显示图像和要预览的下一个图像。我只想显示上一张和下一张图像的预览,当用户实际滑动到它时它将变为完整图像。所以我正在考虑只使用 3 个片段来实现这一点。代码如下:
private class ImagePagerAdapter extends FragmentStatePagerAdapter implements ViewPager.OnPageChangeListener {
private ImageFragment mImageFragment;
private ImagePreviewFragment mPreviousPreviewFragment;
private ImagePreviewFragment mNextPreviewFragment;
public ImagePagerAdapter(FragmentManager fm, ImageFragment image, ImagePreviewFragment previous, ImagePreviewFragment next) {
super(fm);
mImageFragment = image;
mPreviousPreviewFragment = previous;
mNextPreviewFragment = next;
}
@Override
public Fragment getItem(int position) {
if (position == mPager.getCurrentItem()) {
mImageFragment.display(position);
return mImageFragment;
}
if (position < mPager.getCurrentItem()) {
mPreviousPreviewFragment.display(position - 1);
return mPreviousPreviewFragment;
}
mNextPreviewFragment.display(position + 1);
return mNextPreviewFragment;
}
@Override
public int getCount() {
return 100;
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
Log.d(TAG, "onPageScrolled");
}
@Override
public void onPageSelected(final int position) {
Log.d(TAG, "onPageSelected " + position);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
notifyDataSetChanged();
}
}, 500);
}
@Override
public void onPageScrollStateChanged(int state) {
Log.d(TAG, "onPageScrollStateChanged " + state);
}
@Override
public int getItemPosition(Object item) {
return POSITION_NONE;
//return POSITION_UNCHANGED;
}
}
所以基本上,我预先创建了三个片段来显示上一个/下一个预览和当前图像,并将它们返回给 getItem()。我还在 onpageselected() 中通知datasetchange() 以使所有三个位置在用户滑动到新页面时更新片段。
但问题是它会扔掉
Fragment already added IllegalStateException
第二次添加片段时。我认为这是因为它之前已添加。我每次都可以创建一个新片段,但我认为这很浪费。那么如何重用已经创建的片段并更新它们呢?
谢谢, 西蒙
【问题讨论】:
标签: android-fragments android-viewpager illegalstateexception fragmentstatepageradapter