2012-04-03 79 views
1

我在Android上遇到了一個奇怪的問題。在Android ListView中消失ProgressBar

我有一個列表視圖列表元素的自定義視圖。這個自定義視圖包含一個ProgressBar和一個RadioButton。 Here's a nice screenshot

每當我檢查收音機並開始動作模式時,所有進度條消失。 Here's another screenshot

如果屏幕方向改變,或者我滑動鍵盤打開,一切恢復正常。

現在我看到了很多關於這種問題的帖子,涉及到Adapter回收視圖。但是,撥打ListView.invalidateViews不起任何作用。有沒有辦法強制整個ListView的完整刷新?

這裏是我的適配器代碼:

public class SimpleContactsCursorAdapter extends SimpleCursorAdapter { 

    public SimpleContactsCursorAdapter(Context context, int layout, Cursor c, String[] from, 
      int[] to, int flags) { 
     super(context, layout, c, from, to, flags); 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     TextView nameView = (TextView) view.findViewById(R.id.contact_item_name); 
     TextView callView = (TextView) view.findViewById(R.id.contact_call_text); 
     ProgressBar progressBar = (ProgressBar) view.findViewById(R.id.contact_item_progress); 

     String name = cursor.getString(Contact.Columns.COLUMN_INDEX_NAME); 
     int delta = cursor.getInt(Contact.Columns.COLUMN_INDEX_DELTA); 
     String callString; 

     nameView.setText(name); 

     if (delta >= 0) { 
      callString = getString(R.string.call_in, delta); 
     } 
     else { 
      callString = getString(R.string.days_late, Math.abs(delta)); 
      progressBar.setProgressDrawable(mResources.getDrawable(R.drawable.late_progress_bar)); 
     } 
     callView.setText(callString); 

     progressBar.setProgress(Math.abs(delta)); 
    } 
}; 

回答

1

這是因爲你的Activity被銷燬,重建每當有配置上的改變。例如,如果屏幕方向更改,則在顯示新屏幕方向之前,您的Activity會被銷燬並重新創建。問題在於Android在銷燬它之前不會自動保存您的Activity的狀態。默認情況下,如果你的Activity被銷燬,它會丟失所有的數據。

要保存活動的狀態,您必須通過覆蓋onSaveInstanceState(Bundle savedInstanceState)來手動保存數據。要檢索您保存的數據,您需要覆蓋onRestoreInstanceState(Bundle savedInstanceState)

有關如何處理運行時變化的更詳細信息,請訪問以下鏈接:http://developer.android.com/guide/topics/resources/runtime-changes.html

+0

謝謝你的解釋。然而,這不會回答我的問題,那就是:爲什麼我的進度條在'Activity'未被銷燬時消失? – 2012-04-03 08:11:04

2

這看起來像一個循環的問題,但它實際上是比簡單得多。會發生什麼情況是,可繪製的進度條失去對其邊界的跟蹤將其設置爲0,因此消失。您可以通過保存邊界並將其重置爲這樣來解決該問題:

public class SimpleContactsCursorAdapter extends SimpleCursorAdapter { 

public SimpleContactsCursorAdapter(Context context, int layout, Cursor c, String[] from, 
     int[] to, int flags) { 
    super(context, layout, c, from, to, flags); 
} 

@Override 
public void bindView(View view, Context context, Cursor cursor) { 
    TextView nameView = (TextView) view.findViewById(R.id.contact_item_name); 
    TextView callView = (TextView) view.findViewById(R.id.contact_call_text); 
    ProgressBar progressBar = (ProgressBar) view.findViewById(R.id.contact_item_progress); 

    String name = cursor.getString(Contact.Columns.COLUMN_INDEX_NAME); 
    int delta = cursor.getInt(Contact.Columns.COLUMN_INDEX_DELTA); 
    String callString; 

    nameView.setText(name); 

    if (delta >= 0) { 
     callString = getString(R.string.call_in, delta); 
    } 
    else { 
     callString = getString(R.string.days_late, Math.abs(delta)); 

Rect bounds = progressBar.getProgressDrawable().getBounds(); //Save the drawable bound 
progressBar.setProgressDrawable(mResources.getDrawable(R.drawable.late_progress_bar)); 
progressBar.getProgressDrawable().setBounds(bounds); //Set the bounds to the saved value 
} 
    callView.setText(callString); 

    progressBar.setProgress(Math.abs(delta)); 
} }; 

希望這會有所幫助。

+0

好吧cetainly幫助我很快。非常感謝sooo ..我認爲這應該是這個問題的接受答案。這種行爲似乎發生在薑餅。果凍豆很好。我有一個非常類似的問題,這基本上是一個列表視圖中的進度條,當用戶滾動時正在消失 – Hevski 2013-12-19 17:29:18

+0

也有問題,它沒有設置它的自我正確必須重置爲0,然後再次使用類似progressBarItemRating.setProgress(0 ); \t \t \t \t progressBarItemRating.setProgress(Item.getRating()); – Hevski 2013-12-19 17:40:35

+0

適用於薑餅Android 2.3 – 2014-03-20 10:11:43