在ViewPager中,当选择远离2时,页面会丢失内容

时间:2016-11-29 15:26:07

标签: android android-viewpager

我创建了一个动态构建的ViewPager。

在其中一个页面中有一个PDFViewer,表现得很奇怪,但我认为问题和问题与我的ViewPager实现有关,而与PDFViewer无关。无论如何,我也尝试使用ImageViews,TextViews和任何其他类型的东西相同的代码,但只有那个给了我这种行为。

问题是:

  • PDFViewer第一次显示时显示效果很好,这不取决于哪个页码。
  • 如果我向后或向前滑动一页,然后返回PDFViewer,一切都很好。
  • 如果我向前或向后滑动两个或多个页面,然后返回PDFViewer,则视图内容完全为空

看起来好像丢失了内存缓存,并且当需要再次显示其内容时,未通知PDFViewer刷新。

我调试了这个,但没有找到任何有用的东西。

更新: 我发现 - 正如预期的那样 - 当所选页面离它2时,视图就会被破坏。 这是正常的行为吗?如何禁用此行为?

这是我的代码的一部分,但我想它没有什么特别之处:

    showAdapter = new ShowAdapter();
    viewPager = (ViewPager) findViewById(R.id.show_viewPager);
    viewPager.setAdapter(showAdapter);

    LayoutInflater inflater = this.getLayoutInflater();
    FrameLayout v0 = (FrameLayout) inflater.inflate(R.layout.show_empty, null);
    showAdapter.addView(v0, 0);
    showAdapter.notifyDataSetChanged();

   // ... list of similar adds and notifies

适配器。也许那里出了点问题?也许我应该从内部调用一些刷新或通知?

public class ShowAdapter extends PagerAdapter
{
private ArrayList<View> views = new ArrayList<View>();

@Override public int getItemPosition (Object object)
{
    int index = views.indexOf (object);
    if (index == -1)
        return POSITION_NONE;
    else
        return index;
}
@Override public Object instantiateItem (ViewGroup container, int position)
{
    View v = views.get (position);
    container.addView (v);
    return v;
}
@Override public void destroyItem (ViewGroup container, int position, Object object)
{
    container.removeView (views.get (position));
}
@Override public int getCount ()
{
    return views.size();
}
@Override public boolean isViewFromObject (View view, Object object)
{
    return view == object;
}
public int addView (View v)
{
    return addView (v, views.size());
}
public int addView (View v, int position)
{
    views.add (position, v);
    return position;
}
public int removeView (ViewPager pager, View v)
{
    return removeView (pager, views.indexOf (v));
}
public int removeView (ViewPager pager, int position)
{
    pager.setAdapter (null);
    views.remove (position);
    pager.setAdapter (this);

    return position;
}
public View getView (int position)
{
    return views.get (position);
}
}

谢谢。

2 个答案:

答案 0 :(得分:0)

重新加载简历上的内容

 @Override
    public void onResume() {
               super.onResume();
       // Refresh and reload content here 

    }

答案 1 :(得分:0)

我可以通过强制viewPager不使用它来销毁远视图来解决问题:

int[]a = z[1];  //z[1] is {4,5,6}
System.out.print(a[0]); // a[0] is 4

显然5是一个足够大的限制,以保持它们全部活跃。 尽管如此,这是一个非常黑客,并没有很好地解决我的问题,所以我将打开另一个更详细的问题。