在Android ListView中消失ProgressBar
我在Android上遇到了一个奇怪的问题 我有一个列表视图,其中包含列表元素的自定义视图。此自定义视图包含进度条和单选按钮 每当我检查收音机并启动操作模式时,所有进度条都会消失 如果屏幕方向改变,或者我打开键盘,一切都会恢复正常 现在我看到了很多关于这类问题的帖子,都是关于适配器回收视图的。但是,调用在Android ListView中消失ProgressBar,android,list,listview,progress-bar,Android,List,Listview,Progress Bar,我在Android上遇到了一个奇怪的问题 我有一个列表视图,其中包含列表元素的自定义视图。此自定义视图包含进度条和单选按钮 每当我检查收音机并启动操作模式时,所有进度条都会消失 如果屏幕方向改变,或者我打开键盘,一切都会恢复正常 现在我看到了很多关于这类问题的帖子,都是关于适配器回收视图的。但是,调用ListView.invalidateViews没有任何效果。有没有办法强制对整个ListView进行完全刷新 以下是我的适配器代码: public class SimpleContactsCurs
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));
}
};
这是因为您的
活动
被销毁,然后在配置发生更改时重新创建。例如,如果屏幕方向发生变化,则在显示新的屏幕方向之前,活动将被销毁,然后重新创建。问题是Android在销毁活动之前不会自动保存活动状态。默认情况下,如果您的活动
被销毁,它将丢失所有数据
要保存活动的状态,您必须通过覆盖saveInstanceState(Bundle savedInstanceState)
手动保存数据。要检索保存的数据,您需要覆盖恢复安装状态(Bundle savedInstanceState)
有关如何处理运行时更改的更多详细信息,请访问此链接:这看起来像是一个回收问题,但实际上要简单得多。发生的情况是,进度条drawable会松开其边界的轨迹,并将其设置为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));
} };
希望这能有所帮助。谢谢您的解释。然而,这并不能回答我的问题,那就是:当
活动未被破坏时,为什么我的进度条会失效?好吧,这确实帮了我大忙。非常感谢。。我认为这应该是对这个问题的公认答案。这种行为似乎发生在姜饼上。果冻豆很好。我有一个与此非常相似的问题,基本上是listview中的进度条在用户向下滚动时消失了,也有问题,没有正确设置它的自身,必须重置为0,然后使用progressBarItemRating.setProgress(0)之类的东西重新设置;progressBarItemRating.setProgress(Item.getRating());