ViewPager中的片段丢失了它的视图

时间:2016-03-02 19:35:35

标签: android listview android-fragments

我使用Android Studio的标签式活动启动了一个新项目。它使用ViewPager和3个片段= fragment1,fragment2和fragment3创建了一个活动。 我将fragment1更改为listView和TextView,我在创建片段时初始化。 listView中的数据是从SQL数据库中读取的。 应用程序启动时,将显示fragment1,listView显示从SQL读取的数据。 当我从fragment1滑动到fragment2并返回时,fragment1正确显示了listview。但是,当我滑动到fragment3并返回到fragment1时,listview数据会丢失并且我得到一个空白屏幕,尽管textview显示正确。 当我将应用程序更改为只有2个片段时,它不会发生,我可以从fragment1滑动到fragment2并返回多次而不会丢失任何数据。在我添加第3个片段的那一刻,数据在第一次滑动到片段3时丢失,但是如果我仅在片段1和片段2之间滑动则不会丢失。 知道为什么会这样吗?

3 个答案:

答案 0 :(得分:3)

问题解决了。问题是由于适配器在内存中保留了3个片段,正如@Daniel Nugent指出的那样。页面中的数据是从DB加载的,因此在重新创建视图时,当用户滑动时碎片被销毁并重新创建时,listview适配器已丢失数据,并且必须重新填充它。这个问题没有出现在简单的例子中,因为通常所呈现的数据是静态的,并且是在onCreateView方法中加载的。

答案 1 :(得分:0)

之所以会这样,是因为默认情况下ViewPager具有一个名为setOffscreenPageLimit(int i)的函数。这告诉ViewPager需要多少Fragments存储在内存中。默认情况下为“ 2”。因此,当您从片段1 滑动到片段2 时,它仍将片段1 保留在内存中,并且不会从内存中销毁它。但是,当您滑动到片段3 时,它将在内存中包含片段2 片段3 ,因此它将删除片段1

这就是为什么当您返回第一个Fragment时,它会丢失其视图或数据。

尝试使用

mViewPager.setOffscreenPageLimit(your total fragment count +1);

或者更好的解决方案 滑入replace时不要ViewPager片段。 Push将其放回堆栈,当您返回它时,请检查是否存在堆栈,如果有片段,则Pop将其显示并显示。

以下是代码:

public void pushFragments(String tag, Fragment fragment) {
    FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction ft = manager.beginTransaction();
    if (manager.findFragmentByTag(tag) == null) {
        ft.add(R.id.frame_container, fragment, tag);
    }
    String tagOne="com........Frag_one"; //your fragment class name
    String tagTwo="com........Frag_two";
    String tagThree="com........Frag_three";
    String tagFour="com........Frag_profile";

    Fragment fragmentOne = manager.findFragmentByTag(tagOne);
    Fragment fragmentTwo = manager.findFragmentByTag(tagTwo);
    Fragment fragmentThree = manager.findFragmentByTag(tagThree);
    Fragment fragmentFour = manager.findFragmentByTag(tagFour);
    manager.executePendingTransactions();
    // Hide all Fragment
    if (fragmentOne != null) {
        ft.hide(fragmentOne);
    }
    if (fragmentTwo != null) {
        ft.hide(fragmentTwo);
    }
    if (fragmentThree != null) {
        ft.hide(fragmentThree);
    }
    if (fragmentFour != null) {
        ft.hide(fragmentFour);
    }
    // Show  current Fragment
    if (tag.equals(tagOne)) {
        if (fragmentOne != null) {
            ft.show(fragmentOne);
        }
    }
    if (tag.equals(tagTwo)) {
        if (fragmentTwo != null) {
            ft.show(fragmentTwo);
        }
    }
    if (tag.equals(tagThree)) {
        if (fragmentThree != null) {
            ft.show(fragmentThree);
        }
    }
    if (tag.equals(tagFour)) {
        if (fragmentFour != null) {
            ft.show(fragmentFour);
        }
    }
    ft.commit();
}

这是您的称呼方式:

Fragment fragment = new Frag_one();
pushFragments(fragment.getClass().getName(),fragment);

答案 2 :(得分:-2)

使用它可以在内存中保留多个片段。

viewPager.setOffscreenPageLimit(2);