4

我有一个在 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() 中设置一个空适配器,这就是 Google 向我建议的。但它没有用。

4

3 回答 3

2

将此添加到清单活动的清单中:

android:configChanges="orientation|keyboardHidden|screenSize"

并像这样覆盖您的活动的OnConfigurationChanged方法:

@Override
public void onConfigurationChanged(Configuration newConfig) {
}

这不应该再调用你的 onCreate 了。

于 2012-07-24T16:01:32.500 回答
1

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

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

不太简单但更完整的答案: 另一种方法是在 onCreate() 中将 itemAdapter 传递到捆绑包中,请参阅http://developer.android.com/guide/中标题为“在配置更改期间保留对象”的部分主题/资源/runtime-changes.html

于 2012-07-24T15:58:56.710 回答
1

您可以像这样myList在 Android 的方法中保存:onSaveInstanceState

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

只需确保SingleEntry Serializable通过SingleEntry实现Serializable 接口来实现类(注意:如果SingleEntry类内部有任何复杂的数据结构,也应该让它们实现Serializable接口)。然后在你的onCreate你可以使用这样的东西:

@Override
public void onActivityCreated(Bundle savedInstanceState) 
{
    super.onActivityCreated(savedInstanceState);

    if(savedInstanceState != null) { //Check if the save instance state is not null

       //If is not null, retrieve the saved values of the myList variable
       myList = (ArrayList<SingleEntry>) savedInstanceState.getSerializable("myList");

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

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

       lv.setAdapter(itemAdapter);
    }
    else { //Bundle is empty so you should intialize the myList variable
       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);
    }
}
于 2012-07-24T16:32:10.557 回答