自定义ListView在Fragment中旋转时消失

时间:2018-03-08 13:27:20

标签: java android listview android-fragments

问题是我有自己的适配器自定义ListView。但是当我改变屏幕方向时,元素消失了。我做了一些研究并试图使用toolbox.register("random_sampling", lambda x,y: random.sample(x,y)[0], data_set, 1) ,但它对我不起作用。这是代码:

我不能将onConfigurationChanged放在我的AndroidManifest.xml中,因为它是一个片段,所以我把它放在dataload_tab4.xml中。

请不要专注于其他代码。主ListView init位于android:configChanges="orientation|screenSize"

Tab4.java(我有很多标签:D)

InitView()

只是想象一下问题: Here's a screen when it loads; I add some data (cut it from the code)

And here I change orientation. All data disappear.

1 个答案:

答案 0 :(得分:1)

所以,我做了一些研究并自己找到答案。

我发现没有正常的方法可以避免数据丢失,但我们仍然可以将其保存在savedInstanceState中。

因此,我们需要将此添加到我们希望保存数据的Fragment Activity中。

@Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        // Here, you have to put some data in outState bundle, look below for an example
    }

这是一个例子

@Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        int i = 0;
        for (SailorExperience se:ExpsInfo) {
            outState.putString(EXPINFO_KEY + String.valueOf(i) ,se.toString());
            i++;
        }
        outState.putInt(savedInstanceExpCount_key, i);

        i = 0;
        for(String s:busyIDs){
            outState.putString(BUSYIDS_KEY + String.valueOf(i),s);
            i++;
        }
        outState.putInt(savedInstanceBusyIdsCount_key, i);
    }

ExpsInfo 是我的自定义类的ArrayList,

busyIds 是String

的ArrayList

在我的情况下,我需要保存 ArrayList ,所以我将此 ArrayList 的每个数据放在.putString outState中} 捆绑。另外,我将此 ArrayList 的大小另存为另一个整数值。

完成所有操作后,您需要再次加载所有数据

因此,您需要检查savedInstanceState 是否不是null 。如果它不为空,那么您已经保存了一些数据。 不要试图传递一些私有变量它们不会被标记为已初始化,idk如何与公众合作)。 例如,您需要在 onCreateView() 方法中添加此代码:

if(savedInstanceState!=null){
            for(int i = 0; i<savedInstanceState.getInt(savedInstanceExpCount_key); i++){
                ExpsInfo.add(new SailorExperience(savedInstanceState.getString(EXPINFO_KEY + String.valueOf(i))));
            }
            for(int i=0; i<savedInstanceState.getInt(savedInstanceBusyIdsCount_key);i++){
                busyIDs.add(savedInstanceState.getString(BUSYIDS_KEY + String.valueOf(i)));
            }
        }

我在主要UI加载之前正在执行此部分代码。

如果我帮助解决您的问题,请确保您留下了+代表。 ^ _ ^