這主要是一個概念性問題。我在我的Activity中使用了ListFragment。其列表必須顯示這些信息之一:如何在ListView中顯示空視圖,進度視圖和數據?
- 物品的清單
- 如果沒有項目的空視圖
- 「加載」視圖時的數據都是從數據庫加載
@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);
}
:
空視圖自動由框架,因爲我ListFragment上onCreateView的是創建一個像這樣的自定義視圖管理
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時,將使用自定義Loader來查詢數據庫並將一個Cursor返回給ListFragment。我使用自定義Loader而不是CursorLoader,因爲我不想創建ContentProvider。
所以,我希望做的是:當應用程序開始從數據庫數據更查詢時,「加載」視圖將顯示,顯示進度圖片和文本說像「獲取數據「。然後,當Loader完成其工作時,我想在ListView中顯示查詢的數據,如果沒有數據,則顯示「空白」視圖。
由於某些原因,我不想使用ProgressDialog。所以我的問題是:如何提供「加載」視圖?這裏是我的第一次,粗糙的想法:
- 數據更負荷期間更換由自定義視圖的ListView和顯示列表當裝載完成其工作
或
- 使用一個適配器顯示數據
- 使用另一個只包含一個「加載」視圖的項目的適配器
- 設置正確的適配器在正確的時間(當裝載機開始它的工作: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>
這是創建一個容器非常重要的(這裏listContainer)爲ListView 和的空視圖。我嘗試將ListView的可見性設置爲GONE,並自動將空視圖的可見性設置爲可見。看起來有一些內部代碼正在爲ListView執行此操作,因此解決方案是將它們放入容器中並完全顯示/隱藏它。
所以基本上,這個想法是:當數據加載時,我想顯示加載視圖,爲此,我通過將它的可見性隱藏到GONE來隱藏ListView容器(如果我將可見性設置爲INVISIBLE,它會保留視圖中列表的大小,使用GONE就像完全刪除它,因此,「加載」視圖可以佔據所有屏幕),並通過將其可見性顯示爲可見來顯示「加載」視圖。
在我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);
}
}
謝謝Kasra Rahjerdi,我會看看這個源代碼來獲取靈感。 – Shibakaneki
通過查看您提供的鏈接中的源代碼,我找到了解決方案(現在將發佈)。謝謝Kasra Rahjerdi! – Shibakaneki