ArrayAdapter onResume()混淆

时间:2014-02-23 10:26:15

标签: android android-fragments android-arrayadapter

我有一个MyArrayAdapter课,它扩展了ArrayAdapter<MyClass>。 现在我有MyListFragment扩展ListFragment,使用MyArrayAdapter。 类MyActivity会在视图中添加MyListFragment

到目前为止一切顺利。

现在,用户可以更改首选项,我需要在List<MyClass>中更改一些字符串。由于ArrayAdapter仅在onNotifyDataSetChanged()上使用clear(), add(), etc之类的List<MyClass>时才识别MyListFragment,因此我使用onResume重新加载数据以反映更改。

所以我的public class MyListFragment extends ListFragment { private List<MyClass> elements = null; private MyListAdapter myListAdapter = null; public MyListFragment(List<MyClass> elements) { this.elements = elements; } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { myListAdapter = new MyListAdapter(inflater.getContext(), R.layout.foo, elements); setListAdapter(myListAdapter); return super.onCreateView(inflater, container, savedInstanceState); } @Override public void onResume() { myListAdapter.clear(); myListAdapter.addAll( sqliteclass.getAllElements() ); myListAdapter.notifyDataSetChanged(); isSecondTime = true; super.onResume(); } } 包含以下内容:

public class MyListFragment extends ListFragment {

    private List<MyClass> elements = null;
    private MyListAdapter myListAdapter = null;
    private boolean isSecondTime = false;        //NEW

    public MyListFragment(List<MyClass> elements) {
        this.elements = elements;
    }

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        myListAdapter = new MyListAdapter(inflater.getContext(), R.layout.foo, elements);
        setListAdapter(myListAdapter);
        return super.onCreateView(inflater, container, savedInstanceState);
    }

    @Override
    public void onResume() {
        if(isSecondTime){       //NEW
            myListAdapter.clear();
            myListAdapter.addAll( sqliteclass.getAllElements() );
        }                       //NEW
        myListAdapter.notifyDataSetChanged();
        isSecondTime = true;
        super.onResume();
    }

}

这样可行,但问题是当活动第一次运行时,现在 2次到数据库需要一个。所以我修改了类如下:

MyListFragment

所以我的问题是,我正在使用布尔值isSecondTime 进行黑客攻击,以确保第一次我不会使数据库的两次访问可靠吗?适配器保存元素列表,所以第二次我只进行一次旅行。

(例如。如果用户更改首选项,则切换到其他应用程序,Android决定释放一些内存,并从内存中删除List<Elements>,当用户切换回来时,我可以放心{{1}}将从数据库中新鲜出来? - 这个或任何类似的情况)

任何建议都表示赞赏。

2 个答案:

答案 0 :(得分:1)

我认为您应该将Adapter存储在Activity中,只在开始时填充一次,并且独立于Fragment's生命周期。为其制作一个getter并通过Fragment(MyActivity) getActivity().getMyAdapter()访问它。

关于第二个问题:如果用户切换到另一个应用,则有3种可能的情况:

  1. 用户快速回来,没有任何改变。
  2. 用户回来一段时间后,您的应用程序已缓存并恢复 -     你仍然会得到相同的物体状态。
  3. 用户离开你的应用很长一段时间,它被杀了。应用程序必须     从头开始重启。
  4. 在所有情况下,你都是安全的。

答案 1 :(得分:0)

我总是在onResume()

中这样做
public void setList() {
    Log.i("setList","");
    ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice);
    if (items.size()<1)
        adapter.add(getString(R.string.emptylist));
    for(int i=0;i<items.size();i++) {
        adapter.add(items.get(i).item);
    }
    todolist.setAdapter(adapter);
    for(int i=0;i<items.size();i++) {
        todolist.setItemChecked(i, items.get(i).checked);
    }
}

每次我需要更新列表时都会添加一个新的适配器。