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().
В качестве примечания вы всегда должны вызывать статический метод класса, используя имя класса, а не какую-либо ссылку на объект этого класса, это будет более понятно для вас, а также для любого, кто позже прочитает ваш код.