Показать индикатор выполнения перед заполнением списка с помощью CursorLoader

Какой лучший способ показать индикатор прогресса, пока мой список не заполнен данными базы данных?

Я нашел несколько примеров того, как это сделать с помощью assynctask, но в моем случае я использую Loader /CursorLoader.

public class TestActivity extends SherlockFragmentActivity implements
    LoaderCallbacks<Cursor> {

SimpleCursorAdapter mAdapter;
ListView mListView;

private static final String[] UI_BINDING_FROM = new String[] {
        TestDBAdapter.KEY_NAME, TestDBAdapter.KEY_ICON };

private static final int[] UI_BINDING_TO = new int[] { R.id.text, R.id.icon };

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_Test);

    mListView = (ListView) findViewById(R.id.listview);

    mAdapter = new TestAdapter(getApplicationContext(),
            R.layout.list_item_Test, null, UI_BINDING_FROM,
            UI_BINDING_TO, 0);

    mListView.setAdapter(mAdapter);

    getSupportLoaderManager().initLoader(0, null, this);

}

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {


    Uri uri = ContentProviderTest.CONTENT_URI;

    CursorLoader cursorLoader = new CursorLoader(
            this, 
            uri,
            null,
            null,
            null,
            null);

    return cursorLoader;

}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    mAdapter.swapCursor(data);
}

@Override
public void onLoaderReset(Loader<Cursor> loader) {
    mAdapter.swapCursor(null);
}
}

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

Спасибо


person elirigobeli    schedule 18.04.2013    source источник


Ответы (3)


Добавьте небольшой индикатор ProgressBar в файл макета, установив для его видимости значение «исчез». Непосредственно перед созданием CursorLoader установите его видимость на «видимый». Он появится. В onLoadFinished установите видимость ProgressBar на «ушел». Он исчезнет, ​​и ваш ListView загрузится.

Я бы использовал индикатор прогресса в маленьком стиле. Чтобы узнать больше об этом, см. справочную документацию для android.widget.ProgressBar.

Кстати, видимость контролируется с помощью View.setVisibility.

person Joe Malin    schedule 18.04.2013
comment
Ваш ответ помог мне получить 12559601">этот пример . Я считаю, что это самый простой способ. Спасибо - person elirigobeli; 19.04.2013

В дополнение к правильному ответу: в onLoadFinished() неплохо иметь эту проверку:

if (cursor.getCount() > 0) {
  getView().findViewById(R.id.loadingPanel).setVisibility(View.GONE);
  getView().findViewById(android.R.id.list).setVisibility(View.VISIBLE);
}

В противном случае, если вы полагаетесь на ваш curstomService для заполнения базы данных данными, курсор может быть пустым, и в результате не будет ни индикатора выполнения, ни списка с отображаемыми элементами.

person Addicted    schedule 24.08.2014
comment
Бесконечное отображение загрузчика не будет хорошей идеей, вместо этого покажите правильное сообщение Запись не найдена, когда getCount()==0 - person Mohd Mufiz; 07.10.2014

У меня есть costumCursorAdapter в listView.

У меня также есть cursorLoader для замены costumCursorAdapter при изменении данных в базе данных. Данные БД вводятся с помощью поиска, инициированного пользователем.

Ни один из этих советов не сработал, Google не помог - ничто не останавливало индикатор выполнения после того, как он стал видимым - i.e. progress_bar.setVisibility(View.Gone);

В конце концов, как простое и «только пока» решение-

  1. Я создал глобальную переменную, которая будет действовать как счетчик int count = 0. Сбрасывается на 0 при каждом поиске (в методе onClick кнопки).
  2. В bindView пользовательского адаптера, в нижней части этого блока кода, я инициировал подсчет с помощью count ++.
  3. В верхней части блока кода я проверяю, достиг ли счет 4. Если да, я скрываю индикатор выполнения:

            if (count==4){
            pb.setVisibility(View.GONE);
        }
    
  4. Таким образом, когда customAdapter связывает 4-е представление, я знаю, что разумно остановить индикатор выполнения.

  5. У меня никогда не бывает меньше 4 пунктов в списке.

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

person Tamir_B    schedule 30.11.2016