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);
.
Her zaman tam olarak güvenli olmayabilir. Bkz. Https://issuetracker.google.com/issues/37017632 – Paulo