4

画面の回転で 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 とクラス変数です。null アダプタを設定するために充填が行われる前に 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

次のようmyListに Android のメソッドに保存できます。onSaveInstanceState

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

Serializable インターフェイスを実装するようにクラスSingleEntry Serializableを作成してください (注:クラス内に複雑なデータ構造がある場合は、それらにもインターフェイスを実装させる必要があります)。次に、次のようなものを使用できます。SingleEntrySingleEntrySerializableonCreate

@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 に答える
1

簡単な「クイックフィックス」の答え: onCreate() の itemAdapter で .clear() を呼び出します。また、リスト アダプターで .notifyDataSetChanged() を呼び出してみることもできます。

これにより、再度追加する前にアダプター内のアイテムがクリアされます。

単純ではありませんが、より完全な答え:これを行う別の方法は、 onCreate () のバンドル内に itemAdapter を渡すことです。トピックス/リソース/runtime-changes.html

于 2012-07-24T15:58:56.710 に答える