2013-09-10 19 views
16

ListView, CursorLoader ve CursorAdapter ile oldukça basit bir Fragman var. Her şey tek bir aktivitede (sadece parçaları değiştirerek). Benim sorunum, initLoader() çağrısı koyduğum yere göre iki kez onLoadFinished() çağrılıyor. Bu durumlar şunlardır:
Fragment initLoader öğesini çağırdığınızda?

  • konfigürasyon değişikliği başka kullanılarak FragmentTransaction mevcut fragmanını değiştirilmesi
  • (ekran vb dönen) ve daha sonra (backstack haşhaş) geri dönen. Bu durumda bir liste öğesinin ayrıntılı parçası. initLoader() onCreateView(), onActivityCreated konur

() (belgelerinde önerildiği) onLoadFinished() yapılandırması değişiklikten sonra iki kez denir. Neden Rudik Krasniynos tarafından açıklama var. Ancak onLoadFinished(), bir kez daha backstack'den yeni fragman patlatırken çağrılır.

InitLoader() üzerine yerleştirildiğinde, yukarıda bulunanResRes()/onStart() yönteminin durumu tersine çevrilir. Backstack'i patlatmak için bir tane ve konfigürasyon değişikliği için bir tane olmak üzere iki kezLoadFinished().

Bu nedenle soru, Loader'ı onLoadFinished() öğesini iki kez çağırmadan veya Loader'ı iki kez başlatmamaya karar vermeden nerede veya nasıl başlatılacağıdır. Teşekkürler! değiştirilmesi fragman için

Kodu: CursorAdapter için

FragmentTransaction ft = fm.beginTransaction(); 
ft.replace(R.id.root_view, fragment, tag); 
ft.addToBackStack(null); 
ft.commit(); 

Kodu: Ben destek kitaplığı V18 kullanıyorum

//onCreateView 
MyCursorAdapter mAdapter = new MyCursorAdapter(getActivity(), null, 0); 
mList.setAdapter(mAdapter); 
//in other/same lifecycle callbacks 
getLoaderManager().initLoader(ID, null, this); 

.

cevap

1

OnCreate olarak adlandırıyorum ve bildiğim kadarıyla bu en iyi uygulama ... Hemen kullanıyorum ve her şey mükemmel çalışıyor. onLoadFinished yaşamamak için parçanın

getLoaderManager().initLoader(LOADER_ID, new Bundle(), this); 
+0

Her zaman tam olarak güvenli olmayabilir. Bkz. Https://issuetracker.google.com/issues/37017632 – Paulo

0

Çağrı bunu bir kez onResume daki yükleyici init daha çağrılacak.

+0

Neden belirtilen adresleri kullanmıyorsunuz - http://stackoverflow.com/questions/7818717/why-not-use-always-androidconfigchanges-keyboardhiddenorientation – Warlock

3

yılında onActivityCreated(Bundle savedInstanceState) yılında

@Override 
    protected void onCreate(Bundle savedInstanceState) 

          ....... 

      getSupportLoaderManager().initLoader(LOADER_ID, null, this); 

          ....... 
} 
+0

Yukarıda bahsettiğim gibi onResume() de çift çağrıya neden olur. – Warlock

0

Yükleyiciyi başlatmadan önce savedInstanceState öğesini denetlemeye ne dersiniz?

if (savedInstanceState == null) 
    getLoaderManager().initLoader(LOADER_ID, null, this); 
İlgili konular