これは主に概念的な質問です。アクティビティで ListFragment を使用しています。そのリストには、次のいずれかの情報が表示されている必要があります。
- アイテム一覧
- アイテムがない場合は空のビュー
- データベースからデータがロードされるときの「ロード中」ビュー
私の ListFragment の onCreateView は次のようなカスタム ビューを作成しているため、空のビューはフレームワークによって自動的に管理されます。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstance){
if(Globals.DEBUG_LIFECYCLE)
Log.d("Fragment", "ONCREATEVIEW");
return inflater.inflate(R.layout.kanji_list, null);
}
kanji_list のレイアウトは次のとおりです。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ListView android:id="@id/android:list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:listSelector="@android:color/transparent" />
<ch.shibastudio.kanjinotepad.list.KanjiListEmptyView android:id="@id/android:empty"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="@string/no_kanji"
android:visibility="gone"/>
データは、アプリケーションに埋め込まれた SQLite データベースに保存されます。アプリケーションが ListView に更新する必要がある場合、カスタム ローダーを使用してデータベースにクエリを実行し、カーソルを ListFragment に返します。ContentProvider を作成したくないので、CursorLoader ではなくカスタム ローダーを使用します。
だから、私がやりたいことは次のとおりです。アプリケーションがデータベースからデータのクエリを開始すると、「読み込み中」ビューが表示され、進行状況の画像と「データの取得」のようなテキストが表示されます。次に、ローダーがジョブを終了したら、クエリされたデータを ListView に表示するか、データがない場合は「空の」ビューを表示します。
何らかの理由で ProgressDialog を使用したくありません。私の質問は次のとおりです。「読み込み中」ビューを提供するにはどうすればよいですか? これが私の最初の大まかなアイデアです。
- データのロード中に ListView をカスタム ビューに置き換え、ローダーがジョブを終了したときにリストを表示します。
また
- データの表示に 1 つのアダプターを使用する
- 「読み込み中」ビューであるアイテムを 1 つだけ含む別のアダプタを使用します
- 適切なアダプタを適切なタイミングで設定します (ローダーがジョブを開始するとき: myList.setAdapter(mLoadingAdapter)、ローダーがジョブを終了するとき: myList.setAdapter(mDataAdapter))。
他のアイデアはありますか?それを達成するために私に与える「良い習慣」のヒントはありますか?
解決策を見つけました。Kasra Rahjerdi と Harikris に感謝します。 これが私がやった方法です:
まず、ListView、空のビュー、および「読み込み中」ビューのレイアウト ファイルを作成します。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<LinearLayout android:id="@+id/listcontainer"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ListView android:id="@id/android:list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:listSelector="@android:color/transparent"
/>
<ch.shibastudio.kanjinotepad.list.KanjiListEmptyView android:id="@id/android:empty"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="@string/no_kanji"
android:visibility="gone"/>
</LinearLayout>
<ch.shibastudio.kanjinotepad.customviews.LoadingView android:id="@+id/loading"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:visibility="gone"
/>
</LinearLayout>
ListViewと空のビューのコンテナー (ここではlistContainer ) を作成することが非常に重要です。ListView の Visibility を GONE に設定しようとすると、空のビューの Visibility が自動的に Visible に設定されました。ListViewに対してそれを行う内部コードがあるように見えるので、解決策はそれらをコンテナに入れて完全に表示/非表示にすることでした。
つまり、基本的な考え方は次のとおりです。データが読み込まれているときに、読み込み中のビューを表示したいのですが、そのために、Visibility を GONE に設定して ListView コンテナを非表示にします (Visibility を INVISIBLE に設定すると、 GONE を使用すると、ビューを完全に削除するようなものになるため、「読み込み中」のビューはすべての画面を占有できます)、可視性を VISIBLE に設定して「読み込み中」のビューを表示します。
私の ListFragment では、これらのビューの参照を次のように取得しました。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstance){
View v = inflater.inflate(R.layout.kanji_list, null);
mLoadingView = (LoadingView)v.findViewById(R.id.loading);
mListContainer = (LinearLayout)v.findViewById(R.id.listcontainer);
return v;
}
そして、このメソッドを呼び出して「読み込み中」ビューを表示/非表示にします:
private void setLoadingViewVisible(boolean visible){
if(null != mLoadingView && null != mListContainer){
mListContainer.setVisibility(visible ? View.GONE : View.VISIBLE);
mLoadingView.setVisibility(visible ? View.VISIBLE : View.GONE);
}
}