gpt4 book ai didi

android-fragments - 片段已经在 viewpager 中添加了 IllegalStateException

转载 作者:行者123 更新时间:2023-12-04 20:38:53 24 4
gpt4 key购买 nike

我正在使用 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() 中 notifydatasetchange() 使所有三个位置在用户滑动到新页面时更新片段。

但问题是它会抛出
    Fragment already added IllegalStateException

当第二次添加片段时。我想这是因为它之前被添加了。我每次都可以创建一个新片段,但我认为这很浪费。那么如何重用已经创建的片段并更新它们呢?

谢谢,
西蒙

最佳答案

FragmentStatePagerAdapter design 建议创建一个新的 Fragment对于每一页( see Google's example )。不幸的是,您无法阅读 Fragment一旦它被添加到 FragmentManager (在适配器内部隐式发生了什么),因此您得到了异常(exception)。所以官方的谷歌方式是创建新的片段,让它们被适配器销毁和重新创建。

但是如果你想重用页面并利用 ViewHolder 模式的类似物,你应该坚持使用 View 而不是片段。与片段不同, View 可以从其父 View 中删除并重新使用。扩展 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;
}

您应该添加一些额外的逻辑来按位置确定 View 类型(因为您有 3 种类型的 View ),我认为您可以弄清楚。

关于android-fragments - 片段已经在 viewpager 中添加了 IllegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30293192/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com