带LoadManager的ProgressDialog

时间:2014-09-05 15:05:22

标签: android android-listview android-progressbar android-loader

我检查了StackOverflow中提出的问题,但无法解决我的问题。 我试图以异步方式在ListView中获取一些数据(不过载UI线程),而我得到的数据我想显示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 个答案:

答案 0 :(得分:2)

  

但是progressDialog没有旋转,但在列表之后   用数据显示它开始旋转

这种情况正在发生,因为尽管(正确地)使用Loader加载数据,您还可以通过调用getAllAttractions()方法(在onCreate()方法中)手动查询主UI线程上的提供程序这将阻止UI线程。事实上,我不知道你为什么这么做,因为根本没有使用返回的Cursor。删除:

Cursor cursor = getAllAttractions();

从您的活动onCreate()方法开始,以解决此问题。

  

......永不停止(保持旋转)。

这种情况正在发生,因为您在错误的ProgressDialog引用上调用dismiss,因此您不能取消当前显示的ProgressDialog。在Activity的onCreate()方法中,您创建了一个ProgressDialog引用,但是在onCreateLoader()回调中,您使用show()方法创建ProgressDialog的新实例(该方法是静态的)所以当你试图在onLoadFinished()中解雇它时,你会忽略之前创建的ProgressDialog(它甚至没有显示)。解决它使用:

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

在onCreateLoader()回调中。

作为旁注,你应该总是通过使用类名而不是该类的某个对象引用来调用类的静态方法,这将使你和以后读过你代码的任何人都更清楚。< / p>

答案 1 :(得分:0)

好的@Luksprog非常感谢您的帮助。我发现了这个问题。问题出在ContentProvier AUTHORITY声明中。我在一个地方拼错了AUTHORITY字符串。花了一天的时间来弄清楚那个愚蠢的错误。 我非常感谢你的帮助