Исчезающий ProgressBar в Android ListView - PullRequest
1 голос
/ 03 апреля 2012

Я борюсь со странной проблемой на Android.

Я получил ListView с настраиваемым представлением элементов списка. Этот пользовательский вид содержит ProgressBar и RadioButton. Вот хороший скриншот .

Всякий раз, когда я проверяю радио и запускаю режим действия, весь индикатор выполнения исчезает. Вот еще один скриншот .

Если ориентация экрана изменится или я открою клавиатуру, все вернется на круги своя.

Теперь я видел много сообщений о проблемах такого рода, связанных с представлениями об утилизации адаптера. Однако вызов 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));
    }
};

Ответы [ 2 ]

2 голосов
/ 20 мая 2012

Это похоже на проблему переработки, но на самом деле все гораздо проще.То, что происходит, - то, что рисование индикатора выполнения теряет след его границ, устанавливает его в 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));
}    };

Надеюсь, это поможет.

1 голос
/ 03 апреля 2012

Это происходит потому, что ваш Activity уничтожается и затем воссоздается каждый раз, когда происходит изменение конфигурации.Например, если ваша ориентация экрана изменяется, ваш Activity уничтожается и затем воссоздается перед отображением новой ориентации экрана.Проблема в том, что Android не сохраняет автоматически состояние вашей активности перед его уничтожением.По умолчанию, если ваш Activity уничтожен, он теряет все свои данные.

Чтобы сохранить состояние вашей активности, вы должны вручную сохранить ваши данные, переопределив onSaveInstanceState(Bundle savedInstanceState).Чтобы получить сохраненные данные, вам необходимо переопределить onRestoreInstanceState(Bundle savedInstanceState).

. Для получения более подробной информации о том, как обрабатывать изменения во время выполнения, перейдите по этой ссылке: http://developer.android.com/guide/topics/resources/runtime-changes.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...