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

时间:2016-02-05 13:00:45

标签: android gridview screen-orientation restore android-configchanges

我是Android新手(这是我的第一个应用程序),我在GridView中制作了Activity,我希望它能根据屏幕位置做出响应(风景素描)。当然,我为纵向和横向制作了一些GridView行宽的自定义布局值,它的工作非常完美。 除此之外,在每个屏幕方向更改时,GridView再次重新加载。这对用户体验不利。我只喜欢GridView(绝对是其行)来调整到新的屏幕宽度而不执行所有onCreate()指令(从互联网检索GridView的数据,分配已淘汰的数据在HashMap对象中,设置GridView' Adapter,然后显示GridView行。 我浏览了许多论坛主题和一些关于恢复简单值的Google文档,但从未找到恢复GridView而无需重新加载的答案。 我读到了onSaveInstanceState()onRestoreInstanceState(),但我不知道如何在我的案例中使用它们(GridView。)

是否可以为此提供简单的代码示例?或至少有一些头条新闻要遵循?

以下是我在代码中尝试的一些内容,Activity类:

    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);
    }

1 个答案:

答案 0 :(得分:4)

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

您的适配器可能包含项目列表。除非这些项目是基元或String或实施Serializable,否则他们需要实施Parcelable才能实现此目的。

请在此处查看如何执行此操作:How can I make my custom objects Parcelable?

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

然后您的活动将如下所示:

@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());
}