2012-11-18 57 views
3

我使用ListView和自定義適配器來接收JSON響應並將其放入一個不錯的列表中 - 效果很好。更改ListView的空視圖

我現在正在測試各種異常和錯誤處理,並在Android應用程序中捕獲從我的web API收到的錯誤。這一切都很好,處理得很好 - 但是對於我來說,我一直無法改變ListView的'空視圖'。

它在一個片段內,如果這有什麼區別 - 但ProgressBar和ListView是在Fragment中膨脹的XML佈局中定義的。我有一個TextView裏面還包含一些錯誤文本 - 我想知道如何切換ProgressBar爲TextView onError()!

編輯:目前,ListView使用ProgressBar作爲空視圖 - 我想知道如何將其更改爲另一個視圖 - XML定義或編程。

由於所有的API調用都在AsyncTask上執行,因此UI線程並未被鎖定,所以這不是問題。

ListView.removeAllViews()導致相當即將發生的崩潰。

道歉,如果這是微不足道的......

回答

4

你可以定義空視圖是一個FrameLayout裏放什麼您希望空白狀態位於該視圖內,並將其更改爲您更改任何其他視圖的內容的方式。

+0

非常多與這種做法(使用RelativeLayout) - 謝謝! – Andy

0

我剛剛發現這個代碼在一箇舊的項目,應該很好地工作:

View emptyView = inflater.inflate(R.layout.id_of_your_layoout_file, parent, false); 
getListView.setEmptyView(emptyView); 
+0

雖然這不在onCreateView中,所以讀取inflater等是很複雜的。我是否錯誤地處理了這個問題? 我得到了: 'void displayError(){ ListView lv = getActivity()。findViewById(R.id.my_list_view); lv.setEmptyView(R.id.failed_text); }' 裏面的片段類。 – Andy

+0

以不同的方式處理,併爲空視圖使用了較大的佈局 - 帶有ProgressBar和「加載...」文本TextView的RelativeLayout。 出錯後,只需: TextView failed =(TextView)getActivity()。findViewById(R.id.failed_text_view); failed.setText(R.string。failed_to_load); 如果你想要這個效果,你可以直接隱藏TextView直到出錯。 感謝您的快速回復。 – Andy

3

我有兩個空的視圖爲我的ListView。一個是我在從數據庫或服務器加載數據時顯示的ProgressBar。其他的是TextView,當我遇到錯誤或沒有數據時顯示。

我把我的ListView,ProgressBar和TextView放在FrameLayout中。並將ProgressBar和TextView的可見性設置爲「無效」。

<FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1"> 

     <ListView 
      android:id="@+id/my_listview" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"/> 

     <TextView 
      android:id="@+id/empty_textview" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:visibility="gone" 
      android:text="@string/no_contacts_found"/> 

     <ProgressBar 
      android:id="@+id/empty_progressbar" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:visibility="gone" 
      android:layout_gravity="center" 
      android:indeterminate="true"/> 

    </FrameLayout> 

從數據庫或服務器加載數據之前,我改變進度的知名度可見並將其設置爲我的ListView的空視圖。所以我的ListView開始顯示ProgressBar,指示用戶數據仍在加載。

如果我得到錯誤或沒有從數據庫或服務器獲取數據,我將ProgressBar的可見性設置爲「無效」並將TextView的可見性更改爲「可見」。然後將TextView設置爲我的ListView的空視圖。