【问题标题】:Disappearing ProgressBar in Android ListViewAndroid ListView中的ProgressBar消失
【发布时间】:2012-04-16 18:35:21
【问题描述】:

我正在努力解决 Android 上的一个奇怪问题。

我有一个 ListView,其中包含用于列表元素的自定义视图。此自定义视图包含 ProgressBar 和 RadioButton。 Here's a nice screenshot.

每当我检查收音机并启动动作模式时,所有进度条都会消失。 Here's another screenshot.

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

现在我看到很多关于这类问题的帖子,与适配器回收视图有关。但是,调用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 list listview progress-bar


    【解决方案1】:

    发生这种情况是因为您的Activity 被销毁,然后在配置发生更改时重新创建。例如,如果您的屏幕方向发生变化,您的 Activity 将被销毁,然后在显示新的屏幕方向之前重新创建。问题是 Android 在销毁之前不会自动保存 Activity 的状态。默认情况下,如果您的 Activity 被销毁,它会丢失所有数据。

    要保存 Activity 的状态,您必须通过覆盖 onSaveInstanceState(Bundle savedInstanceState) 手动保存数据。要检索您保存的数据,您需要覆盖onRestoreInstanceState(Bundle savedInstanceState)

    有关如何处理运行时更改的更多详细信息,请访问此链接:http://developer.android.com/guide/topics/resources/runtime-changes.html

    【讨论】:

    • 感谢您的解释。然而,这不会回答我的问题,即:当Activity 没有被破坏时,为什么我的进度条会消失?
    【解决方案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,然后使用progressBarItemRating.setProgress(0)之类的东西再次设置; progressBarItemRating.setProgress(Item.getRating());
    猜你喜欢
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    相关资源
    最近更新 更多