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

how to retain state of listview during orientation changes?

大家好,我知道在阅读我的问题标题后,您会发现回答起来非常简单,但由于我是 android 开发的新手,所以我发现很难在方向更改期间保持列表视图的状态,甚至关于片段状态,我在 google 上浏览了很多,但我没有找到在方向更改期间保留状态的任何令人满意的解决方案,我知道它们是一种 onsaveinstancestate() 方法,您必须在其中放置每个视图数据,但我认为它们是一个更好的解决方案,所以请帮助我找到解决方案。您还可以提供 link 方向改变的好教程。 提前致谢

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

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

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

    然后当您覆盖 onRestoreInstanceState(savedInstanceState) 时,在重新创建列表视图后调用;

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

检查空值,祝你好运!

你可以使用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()
        ...
    }


}

在片段中创建您的列表视图 - 片段将是 -

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


}

}

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

android:configChanges="keyboardHidden|orientation|screenSize"