0

我一直试图弄清楚是什么导致我的应用程序在两个ListViews 中丢失数据,两个选项卡中的每个选项卡中的一个,这两个选项卡都是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超类而不是super.onRestart();.

于 2012-08-28T04:38:19.403 回答