屏幕方向更改后恢复 Android GridView(无需重新加载)

Restore Android GridView after screen orientation change (without reloading it)

我是 Android 的新手(这是我的第一个应用程序),我在 Activity 中创建了一个 GridView,我希望它能够根据屏幕进行响应位置(纵向/横向)。当然,我为纵向和横向制作了一些 GridView 行宽的自定义布局值,并且效果很好。

除此之外,在每次屏幕方向更改时,GridView 都会再次重新加载。这对用户体验不利。我只喜欢 GridView(绝对是它的行)调整到新的屏幕宽度,而无需执行所有 onCreate() 指令(从互联网检索 GridView 的数据,将检索到的数据分配到 HashMap对象,设置GridViewAdapter,然后显示GridView的行。

我浏览了很多论坛帖子和一些讨论恢复简单值的 Google 文档,但从未找到无需重新加载即可恢复 GridView 的答案。

我读到了 onSaveInstanceState()onRestoreInstanceState(),但我不知道如何在我的案例中使用它们(GridView 案例)。

有人可以为此提供一个简单的代码示例吗?或者至少要关注一些头条新闻?

这是我在代码中尝试的一些内容,在 Activity class :

    private Parcelable mListInstanceState;
    private Parcelable mAdapterInstanceState;

    private GridView gridView = null;
    private MyAdapter myAdapter = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);

       gridView = (GridView) findViewById(R.id.gridview);

       // Check whether we're recreating a previously destroyed instance
       if(savedInstanceState != null) {
            // Restore value of members from saved state
            mListInstanceState = savedInstanceState.getParcelable("gridview");
            mAdapterInstanceState = savedInstanceState.getParcelable("adapter");
       }
       else {
            // Retrieve data from internet, fill HashMap object, 
            // set Adapter and display GridView only for the first time the activity is created
            attemptToDisplayGirdViewItems();
       }
    }

    @Override
    protected void onSaveInstanceState(Bundle state) {
        // Save activity state

        super.onSaveInstanceState(state);

        state.putParcelable("gridview", gridView.onSaveInstanceState());
        // state.putParcelable("adapter", myAdapter);               
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        // Retrieve and restore activity state

        // Restore state members from saved instance
        mListInstanceState = savedInstanceState.getParcelable("gridview");
        mAdapterInstanceState = savedInstanceState.getParcelable("adapter");

        super.onRestoreInstanceState(savedInstanceState);
    }

您不需要保存视图。如果它们有 ID,它们将被自动保存(例如 GridView 的滚动位置)。您需要保存的是适配器的数据集。

您的适配器可能包含一个项目列表。除非这些项目是原语或 String 或实现 Serializable,否则它们需要实现 Parcelable 才能工作。

在此处查看操作方法:How can I make my custom objects Parcelable?

您的适配器需要一个 getItems 方法,该方法 returns 数据集 - 一个 ArrayList 可包裹项目。它还需要有一个 setItems(...) 方法或一个将项目列表作为参数的构造函数。

那么你的 activity 将如下所示:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
    gridView = (GridView) findViewById(R.id.gridview);

    myAdapter = new MyAdapter(); // Create empty adapter.
    if(savedInstanceState != null) {
        ArrayList<MyItem> items = savedInstanceState.getParcelableArrayList("myAdapter");
        myAdapter.setItems(items); // Load saved data if any.
    }
    gridView.setAdapter(myAdapter);
}

@Override
protected void onSaveInstanceState(Bundle state) {
    super.onSaveInstanceState(state);
    state.putParcelableArrayList("myAdapter", myAdapter.getItems());
}