以前は、Fragment
時間のかかるフェッチデータに基づいてUIを更新するがあります。
public class HomeMenuFragment extends SherlockFragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Infos arg1 = performTimeConsumingDataStructureLoading();
// Add in various UI views in v, according to information in loaded
// data structure.
View v = inflater.inflate(R.layout.home_menu, container, false);
// ...
// Adding several LinearLayout and TextView into v, based on
// information from loaded data structure (arg1)
// ...
return v;
}
....
}
これは本当に良いデザインではありません。場合によってperformTimeConsumingDataStructureLoading
は、5秒以上かかることがあり、ANR(アプリケーションが応答しません)を取得します
http://developer.android.com/reference/android/content/AsyncTaskLoader.htmlを参照することで、より良い解決策が得られます。私が遭遇した例は、UIを介して間接的に更新することArrayAdapter
です。
public class HomeMenuFragment extends SherlockFragment implements LoaderManager.LoaderCallbacks<HomeMenuFragment.Infos> {
@Override
public void onLoadFinished(Loader<Infos> arg0, Infos arg1) {
LayoutInflater inflater = this.getLayoutInflater(null);
ViewGroup container = (ViewGroup)this.getView().getParent();
// Remove previous old views, as onLoadFinished might be triggered
// by onContentChanged too.
container.removeAllViews();
View v = inflater.inflate(R.layout.home_menu, container, false);
// ...
// Adding several LinearLayout and TextView into v, based on
// information from loaded data structure (arg1)
// ...
container.addView(v);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return super.onCreateView(inflater, container, savedInstanceState);
}
....
}
ArrayAdapter
私は使用していないので、私は持っていませんListFragment
。私がやりたいのは、いくつかTextView
をいくつかに追加することLinearLayout
です。次に、のコンテナに追加LinearLayout
します。Fragment
ただし、次のコードではnullポインタ例外が発生します。
ViewGroup container = (ViewGroup)this.getView().getParent();
onLoadFinished
から後にフラグメントUIを動的に更新する正しい方法は何AsyncTaskLoader
ですか?