我正在使用 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
当第二次添加片段时。我认为这是因为之前已经添加了。我每次都可以创建一个新片段,但我认为这很浪费。那么我如何重用已经创建的片段并更新它们呢?
谢谢,
西蒙
FragmentStatePagerAdapter
设计建议创造一个新的Fragment
对于每个页面(看谷歌的例子 http://developer.android.com/reference/android/support/v4/app/FragmentStatePagerAdapter.html)。不幸的是你无法阅读Fragment
一旦它被添加到FragmentManager
(适配器内部隐式发生的事情),因此你得到了异常。所以谷歌官方的方式是创建新的片段并让它们被适配器销毁并重新创建。
但是,如果您想重用页面并利用类似的 ViewHolder 模式,您应该坚持使用视图而不是片段。与片段不同,视图可以从其父级中删除并重新使用。延长PagerAdapter
并实施instantiateItem()
像这样:
@Override
public Object instantiateItem(ViewGroup container, final int position) {
//determine the view type by position
View view = viewPager.findViewWithTag("your_view_type");
if (view == null) {
Context context = container.getContext();
view = LayoutInflater.from(context).inflate(R.layout.page, null);
view.setTag("your_view_type");
} else {
ViewGroup parent = (ViewGroup) item.getParent();
if (parent != null) {
parent.removeView(item);
}
}
processYourView(position, view);
container.addView(view, MATCH);
return view;
}
您应该添加一些额外的逻辑来按位置确定视图类型(因为您有 3 种类型的视图),我认为您可以弄清楚。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)