我有一个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}}将从数据库中新鲜出来? - 这个或任何类似的情况)
任何建议都表示赞赏。
答案 0 :(得分:1)
我认为您应该将Adapter
存储在Activity
中,只在开始时填充一次,并且独立于Fragment's
生命周期。为其制作一个getter并通过Fragment
从(MyActivity) getActivity().getMyAdapter()
访问它。
关于第二个问题:如果用户切换到另一个应用,则有3种可能的情况:
在所有情况下,你都是安全的。
答案 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);
}
}
每次我需要更新列表时都会添加一个新的适配器。