我使用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之间滑动则不会丢失。 知道为什么会这样吗?
答案 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);