Android:ListView在更改方向后不加载项目

时间:2013-03-25 18:18:13

标签: android android-listview

编辑 - 请先阅读!

事实证明我犯了一个非常愚蠢的错误。我的布局包含 WebView ,其背景颜色与 ListView 完全相同。 WebView 在活动加载后的某个时刻被隐藏,但我忘了在方向更改后隐藏它,所以它覆盖了 ListView ,它使它看起来像是空的,实际上它已被正确加载。我将在这里留下这个问题,因为它提供了一个关于如何在方向改变后恢复 ListView 数据的工作示例:)

---------------------------------

那么,这在当时看起来很简单。我正在尝试在方向更改后恢复ListView上的数据。数据是从Web服务获取的,所以起初我只是在更改后调用Web服务。这工作正常,但重新获取数据对于这么简单的情况来说太慢了,所以我想我宁愿保存ListView的状态,然后只需恢复它而不必返回服务器。

我正在使用 onSaveInstanceState

执行此操作
protected void onSaveInstanceState (Bundle outState) {
    ListAdapter adapter = this.listView.getAdapter();

    if (adapter != null) {
        try {
            String dataSource = ((JSONArrayAdapter)adapter).getDataSource().toString(1);
            outState.putString("dataSource", dataSource);
        } catch (Exception e) {
            Log.w("MainActivity", "Invalid data adapter", e);
        }
    }
}

JSONArrayAdapter 是我正在使用的自定义适配器,它与 JSONArray 对象一起用作其数据源。我知道它有效,因为它在方向改变之前正确显示了所有内容。

将ListView数据保存为JSON字符串后,我尝试使用 onCreate 恢复它:

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

    listView = (ListView)findViewById(R.id.listView);
    progressBar = (ProgressBar)findViewById(R.id.progressBar);

    String dataSource = null;
    if (savedInstanceState != null) {
        dataSource = savedInstanceState.getString("dataSource");
    }

    if (dataSource == null) {
        reloadList(); //this is a call to the web service
    } else {
        try {
            JSONArray array = new JSONArray(dataSource);

            this.listView.setAdapter(new JSONArrayAdapter(getApplicationContext(), array));
            this.progressBar.setVisibility(View.GONE);
        } catch (JSONException e) {
            Log.w("MainActivity", "Invalid data adapter", e);
            reloadList();
        }
    }
}

结果是我翻转设备并且没有错误,但ListView是空的(或者它的项目至少是不可见的)。使用调试器,我已经验证了JSON字符串是否正确存储。我甚至逐步完成了适配器上的 getView 方法,以确保正确生成视图。值得注意的是,代码没有进入任何catch块。有谁知道什么可能导致ListView为空?感谢

2 个答案:

答案 0 :(得分:-1)

在应用程序的清单文件中声明android:configChanges,并在onConfigurationChanged中执行您要更改屏幕方向的操作。

您可以找到更详细的讨论here

答案 1 :(得分:-1)

也许:

protected void onSaveInstanceState (Bundle outState) {
    super.onSaveInstanceState(outState);
    // same as you do
}