在Android ListView中消失ProgressBar

在Android ListView中消失ProgressBar,android,list,listview,progress-bar,Android,List,Listview,Progress Bar,我在Android上遇到了一个奇怪的问题 我有一个列表视图,其中包含列表元素的自定义视图。此自定义视图包含进度条和单选按钮 每当我检查收音机并启动操作模式时,所有进度条都会消失 如果屏幕方向改变,或者我打开键盘,一切都会恢复正常 现在我看到了很多关于这类问题的帖子,都是关于适配器回收视图的。但是,调用ListView.invalidateViews没有任何效果。有没有办法强制对整个ListView进行完全刷新 以下是我的适配器代码: public class SimpleContactsCurs

我在Android上遇到了一个奇怪的问题

我有一个列表视图,其中包含列表元素的自定义视图。此自定义视图包含进度条和单选按钮

每当我检查收音机并启动操作模式时,所有进度条都会消失

如果屏幕方向改变,或者我打开键盘,一切都会恢复正常

现在我看到了很多关于这类问题的帖子,都是关于适配器回收视图的。但是,调用
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());