Android:屏幕旋转后列表视图双重输入

时间:2012-07-24 15:58:18

标签: android listview android-listview

我有一个在onCreate()中填充的listView,因为在屏幕旋转中再次调用onCreate(),它再次填充它,因此在每次旋转后我得到的条目当然添加了我不想要的内容。 onCreate基本上是:

@Override
public void onActivityCreated(Bundle savedInstanceState) 
{
    super.onActivityCreated(savedInstanceState);
    myList = new ArrayList<SingleEntry>();
    new getList().execute(); //Async task to fill myList

    ListView lv = (ListView) getActivity().findViewById(R.id.ListView01);

    itemAdapter = new ItemAdapterOverview(getActivity().getApplicationContext(), myList);


    lv.setAdapter(itemAdapter);
}

其中myList是ArrayList和类变量。我在onCreate()尝试填充之前设置了一个null适配器,这就是Google向我建议的。但它没有用。

3 个答案:

答案 0 :(得分:2)

在清单上为列表活动添加此内容:

android:configChanges="orientation|keyboardHidden|screenSize"

并覆盖您活动的OnConfigurationChanged方法:

@Override
public void onConfigurationChanged(Configuration newConfig) {
}

这不应该再打电话给你的onCreate了。

答案 1 :(得分:1)

简单的“快速修复”答案: 在onCreate()上的itemAdapter上调用.clear(),你也可以尝试在列表适配器上调用.notifyDataSetChanged()。

在再次添加之前,这将清除适配器中的项目。

不太简单但更完整的答案: 另一种方法是在onCreate()中传递bundle内的itemAdapter,参见http://developer.android.com/guide/topics/resources/runtime-changes.html中标题为“在配置更改期间保留对象”的部分

答案 2 :(得分:1)

您可以将myList保存在Android方法onSaveInstanceState中,如下所示:

protected void onSaveInstanceState(Bundle bundle) {
    bundle.putSerializable("myList", myList);
    super.onSaveInstanceState(bundle);
}

请确保通过SingleEntry实现Serializable interface来创建课程Serializable SingleEntry(注意:如果{{1}内部有任何复杂的数据结构你应该让它们实现SingleEntry接口。然后在Serializable中,您可以使用以下内容:

onCreate