ProgressDialog с LoadManager

Я проверил вопросы, заданные в Stackru, но не смог решить их. Я пытаюсь получить некоторые данные в ListView в асинхронном режиме (чтобы не перегружать поток пользовательского интерфейса), и пока я получаю данные, я хочу показать ProgressDialog, Я получаю данные, используя ContentProvider и он успешно загружает данные в ListView , Тем не менее progressDialog не вращается, но после отображения списка с данными он начинает вращаться и никогда не останавливается (продолжает вращаться). Как я могу сделать ProgressDialog вращаться и dismiss() после ListView Видимо

Вот деятельность, которая реализует LoaderCallbacks:

public class AttractionsActivity extends Activity implements LoaderManager.LoaderCallbacks<Cursor> {

DatabaseHelper dbHelper;
private SimpleCursorAdapter cursorAdapter;
private ListView attractionsListView;
private ProgressDialog progressDialog;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.custom_listview);


    attractionsListView = (ListView)findViewById(R.id.lvCustom);
    progressDialog = new ProgressDialog(this);
    progressDialog.setMessage("Loading");
    progressDialog.setCancelable(false);
    progressDialog.setIndeterminate(true);
    progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);

    dbHelper = new DatabaseHelper(this);

    dbHelper.open();
    populateAttractionsListView();
    dbHelper.close();
}

private void populateAttractionsListView() {
    //final ImageView image = (ImageView) findViewById(R.id.ivAttImage);
    //Initialize Loader
    getLoaderManager().initLoader(0, null, this);
    String[] from = {PoisContract.COLUMN_POI_MAIN_PIC, PoisContract.COLUMN_POI_NAME};
    int[] to = {R.id.ivAttImage, R.id.tvAttName};
    //Initialize CursorAdapter
    cursorAdapter = new SimpleCursorAdapter(this, R.layout.attractions_listview_row, null, from, to, 0);
    ViewBinder viewBinder = new ViewBinder() {
        @Override
        public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
            boolean binded = false;
            if(view != null){
                String imgName = cursor.getString(columnIndex);
                int imgResId = getResources().getIdentifier(imgName, "drawable", getPackageName());
                ((ImageView) view).setImageResource(imgResId);
                binded = true;
            }
            return binded;
        }
    };
    //Set Adapter but there is no cursor right now
    attractionsListView.setAdapter(cursorAdapter);
    //Set Binder to the adapter
    cursorAdapter.setViewBinder(viewBinder);
    //Hide ListView as there is no data returned
    attractionsListView.setVisibility(View.GONE);

}

private Cursor getAllAttractions(){
    ContentResolver resolver = getContentResolver();

    return resolver.query(PoisContract.CONTENT_URI, PoisContract.PROJECTION, null, null, null);
}

@Override
public Loader<Cursor> onCreateLoader(int i, Bundle bundle) {
    progressDialog.show(this, "Please wait...", "Loading List...");

    CursorLoader cursorLoader = new CursorLoader(AttractionsActivity.this, PoisContract.CONTENT_URI, PoisContract.PROJECTION, null, null, null);
    return cursorLoader;
}

@Override
public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
    cursorAdapter.swapCursor(cursor);

    progressDialog.dismiss();
    attractionsListView.setVisibility(View.VISIBLE);
}

@Override
public void onLoaderReset(Loader<Cursor> cursorLoader) {
    //Data is not available anymore, delete reference
    cursorAdapter.swapCursor(null);
}

2 ответа

Решение

Хорошо @Luksprog большое спасибо за помощь. Я нашел проблему. Проблема была в ContentProvier ВЛАСТЬ декларация. Я неправильно написал строку AUTHORITY в одном месте. Потребовался день, чтобы понять эту глупую ошибку. Я очень ценю вашу помощь

однако progressDialog не вращается, но после отображения списка с данными он начинает вращаться

Это происходит потому, что, несмотря на (правильно) использование Loader для загрузки данных, вы также вручную запрашиваете провайдера в главном потоке пользовательского интерфейса посредством вызова getAllAttractions() метод (в методе onCreate()), который блокирует поток пользовательского интерфейса. На самом деле я не знаю, почему вы это сделали, так как возвращенный Курсор вообще не используется. Удалить:

Cursor cursor = getAllAttractions();

линия от вашей деятельности onCreate() способ решить эту проблему.

... и никогда не останавливается (продолжает вращаться).

Это происходит потому, что вы вызываете dismiss для неправильной ссылки ProgressDialog, поэтому вы не отменяете отображаемый в данный момент ProgressDialog. В методе onCreate() Activity вы создаете ссылку на ProgressDialog, однако в обратном вызове onCreateLoader() вы используете метод show(), который создает новый экземпляр ProgressDialog(метод является статическим), поэтому при попытке его отклонить в onLoadFinished() вы закрываете ранее созданный ProgressDialog(который даже не отображается). Для ее решения используйте:

progressDialog = ProgressDialog.show(this, "Please wait...", "Loading List...");

в обратном вызове onCreateLoader().

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

Другие вопросы по тегам