【问题标题】:Using async Task to load an apps listView with images in Android使用异步任务在 Android 中加载带有图像的应用程序 listView
【发布时间】:2014-03-06 20:03:50
【问题描述】:

我有一个片段对话框,其中包含设备上安装的所有应用的列表。
有时加载需要一些时间,我想在加载时显示ProgressDialog
我尝试了以下代码,但没有任何好处:

@Override
public void onAttach(Activity activity) {
    // Show progress dialog
    showProgressDialog(activity);
    super.onAttach(activity);
}

private void showProgressDialog(Activity activity) {
    mProgressDialog = new ProgressDialog(activity);
    mProgressDialog.setTitle(R.string.loading);
    mProgressDialog.setMessage(getString(R.string.shared_options_wait_while_applist_loads));
    mProgressDialog.show();
}

onCreate 加载整个列表和应用图像,然后我使用:

@Override
public void onStart() {
    stopProgressDialog();
    super.onStart();
}

    private void stopProgressDialog() {
        mProgressDialog.dismiss();
}

现在我正在考虑在异步任务中加载整个列表,但我不知道异步任务应该做什么,它可能应该加载列表,但是我如何等待列表并获取列表什么时候准备好? (我认为应该使用回调之类的东西?)

谢谢

【问题讨论】:

  • 您可以在onPostExecute 类上的onPostExecute 方法上使用UI,创建适配器并在该方法上设置您的列表,您可以在onPreExecute 上显示您的progressDialog,这个两种方法与UI thread 一起使用
  • 有什么例子可以参考一下吗?谢谢
  • 如果你搜索你可以找到很好的例子。你可以看到thisthis

标签: android android-asynctask


【解决方案1】:

您可以通过添加 DataSetObserver 来观察适配器中的数据集变化。

@Override
public void onCreate(Bundle savedInstanceSate){
  super.onCreate(savedInstanceState);
  setContentview(R.layout.main_view);
  ListView myList = (ListView) findViewById(R.id.my_list);
  MyDataTypeAdapter adapter = new MyDataTypeAdapter();
  myList.setAdapter(adapter);
  adapter.registerDataSetObserver( new DataSetObserver(){
     @Override
     public void onChange(){
          //do stuff here
     }
  });
}

这种方式会在你的数据集发生变化时加载 onChange,你可以在那里下载你的图片。

但是,我最好为适配器中的每一行执行一个 AsyncTask 并独立下载它的图像。为此,您还可以使用 UniversalImageLoader 库。

【讨论】:

  • 但是我的适配器是用所有数据创建的(这是构造函数),我是否应该将其设置为null 并让异步任务将项目一一添加到适配器?
  • 在您的 ListAdapter getView() 方法中,您可以编写一个异步任务来填充视图的图像。这样,如果您没有视图,则不会触发 asynctask,但是当您这样做时,它将加载视图。另外,为避免启动太多 asynctak,请在开始下载之前检查您是否拥有该图像
【解决方案2】:

你可以试试 Android Bitmap Fun 例子

Android 图片演示:http://developer.android.com/training/displaying-bitmaps/index.html

这个例子是 GridView,你可以通过改变 listItem 中的视图来为 ListView 使用相同的适配器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多