如何在方向变化期间保留列表视图的状态?

时间:2015-01-22 15:54:39

标签: android listview android-fragments orientation-changes

大家好,我知道在阅读我的问题的标题之后你发现它很简单回答但是因为我是android开发的新手所以我发现在方向改变期间很难保留listview的状态甚至片段状态我冲浪很多在谷歌,但我没有找到任何令人满意的解决方案在方向改变期间保持状态我知道他们是一个onsaveinstancestate()方法,你必须把你的每个视图数据,但我认为他们是一个更好的解决方案,所以请帮助我找到它的解决方案。您还可以提供有关方向更改的良好教程链接。 在此先感谢

3 个答案:

答案 0 :(得分:1)

  • 我注意到,根据您的实现,默认情况下会保存列表视图状态,但要恢复状态,请重新创建列表视图并确保之后调用其中一个以savedInstanceState为参数的超级方法(不是之前)。为什么?由于listview状态已保存,super方法将恢复它,如果在调用super后重新创建,则覆盖已恢复状态。

  • 另一种方法是覆盖活动的onSaveInstanceState(outState),将listview状态放在包中,

    outState.putParcelable("listview.state", listview.onSaveInstanceState());
    

    然后当你重写onRestoreInstanceState(savedInstanceState)时,在重新创建列表视图后,你会调用;

    Parcelable listViewState = savedInstanceState.getParcelable("listview.state");
    listview.onRestoreInstanceState(listViewState);
    

检查空值并祝你好运!

答案 1 :(得分:0)

你可以使用setRetainInstance(true);在片段中

public class MyActivity extends Activity {


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // find the retained fragment on activity restarts
        FragmentManager fm = getFragmentManager();
        dataFragment = (RetainedFragment) fm.findFragmentByTag(“data”);

        // create the fragment and data the first time
        if (dataFragment == null) {
            // add the fragment
            dataFragment = new DataFragment();
            fm.beginTransaction().add(dataFragment, “data”).commit();
            // load the data from the web

        }

        // the data is available in dataFragment.getData()
        ...
    }


}

在片段内创建Listview - 片段将是 -

public class RetainedFragment extends Fragment {


    // this method is only called once for this fragment
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }
 @Override
public void onActivityCreated(Bundle savedInstanceState) {
     super.onActivityCreated(savedInstanceState);
    Log.d(TAG, "onActivityCreated");
 // retain this fragment
   setRetainInstance(true);
   // create your listview here


}

}

答案 2 :(得分:0)

我会通过将此行添加到清单中来保留整个Activity的状态,作为Activity标记内的属性:

android:configChanges="keyboardHidden|orientation|screenSize"