setRetainInstance(true)
当包含因某种原因被杀死和重建时,将告诉FragmentManager
保留片段。Activity
它不能保证在Fragment
添加或替换事务后实例会继续存在。听起来您的适配器正在被垃圾收集,而您没有创建新的适配器。
一个更普遍的简单解决方案是制作一个无视图Fragment
以保留您的ListAdapter
. 这样做的方法是创建Fragment
,将保留实例设置为 true,然后null
在方法中返回onCreateView()
。要添加它,只需addFragment(Fragment, String)
通过FragmentTransaction
. 您永远不会删除或替换它,因此它会在应用程序的整个时间内始终保留在内存中。屏幕旋转不会杀死它。
无论何时ListFragment
创建您的,onCreateView()
获取FragmentManager
并使用该方法findFragmentById()
或FindFragmentByTag()
从内存中检索您保留的片段。然后从该片段中获取适配器并将其设置为列表的适配器。
public class ViewlessFragment extends Fragment {
public final static string TAG = "ViewlessFragment";
private ListAdapter mAdapter;
@Override
public ViewlessFragment() {
mAdapter = createAdater();
setRetainInstance(true);
}
@Override
public void onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return null;
}
public ListAdapter getAdapter() {
return mAdapter;
}
}
public class MyListFragment extends ListFragment {
final public static String TAG = "MyListFragment";
@Override
public void onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View returnView = getMyView();
final ViewlessFragment adapterFragment = (ViewlessFragment) getFragmentManager().findFragmentByTag(ViewlessFragment.TAG);
setListAdapter(ViewlessFragment.getAdapter());
return returnView;
}
}
public class MainActivity extends FragmentActivity {
@Override
public void onCreate(Bundle icicle) {
// ... setup code...
final FragmentManager fm = getSupportFragmentManager();
final FragmentTransaction ft = fm.beginTransaction();
ViewlessFragment adapterFragment = fm.findFragmentByTag(ViewlessFragment.TAG);
if(adapterFragment == null) {
ft.add(new ViewlessFragment(), ViewlessFragment.TAG);
}
ft.add(R.id.fragmentContainer, new MyListFragment(), MyListFragment.TAG);
ft.commit();
}
}