2012-04-03 75 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