0

私は、アプリがListView2つのタブのそれぞれに1つずつ、2つの秒でデータを失う原因を突き止めようとして立ち往生しています。どちらもListFragmentsです。ListViewアプリを最前線に持ってくると、電話ではsがランダムに空になります。

アプリケーションをバックアップするときにデータを復元する方法について何かが欠けていると思います。通常、アプリは復元され、両方のタブのデータが表示されます。

ただし、実際の電話でのみ、データはListViewsから削除されるようですが、再現可能なパターンを見つけることができません。

DDMSを使用してガベージコレクションをさまざまな組み合わせでシミュレートしましたが、データの損失を再現できません。これが私がライフサイクル、単純化された、そして基本的に完全な擬似コードをどのように扱っているかです。

私はライフサイクル構造を調べて、それが機能していると思いました。

間違ってリフレッシュしていますか?

主な活動

public class MyActivity extends FragmentActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // I don't refresh here
        // add both tabs to the tab adapter
    }

    public void onRestart() {
        super.onRestart(); 
        reloadTab1();
        reloadTab2();
    }
}

タブ1

public class MyTab1 extends ListFragment {
    static MyTab1Adapter mAdapter;
    ArrayList<MyObject> mItems;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // retain state
        setRetainInstance(true);
        reloadTab1(getActivity());
    }

    public void reloadTab1(Context context) {
        mItems = updateItems();

        if (mAdapter == null) {
            mAdapter = new MyTab1Adapter(context, R.layout.tab1, mItems);
            setListAdapter(mAdapter);
        }           
        else {
            mAdapter.setNewList(mItems);
            mAdapter.notifyDataSetChanged();
        }
    }
}

タブ2

public class MyTab2 extends ListFragment {
    static MyTab2Adapter mAdapter;
    ArrayList<MyObject> mItems;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // retain state
        setRetainInstance(true);
        reloadTab2(getActivity());
    }

    public void reloadTab2(Context context) {
        mItems = updateItems();

        if (mAdapter == null) {
            mAdapter = new MyTab2Adapter(context, R.layout.tab2, mItems);
            setListAdapter(mAdapter);
        }           
        else {
            mAdapter.setNewList(mItems);
            mAdapter.notifyDataSetChanged();
        }
    }
}
4

1 に答える 1

1

コードに小さなタイプミスがあり、onRestartコールバックを使用しましたが、onResumeの代わりにスーパークラスからmthodを呼び出しましたsuper.onRestart();

于 2012-08-28T04:38:19.403 に答える