在Adapter中的AsyncTask期间使用自定义ProgressDialog

时间:2011-08-24 07:24:40

标签: android listview progressdialog android-arrayadapter

我使用ArrayAdapter在ListView中显示项目。此ListView中的每一行都拥有一个按钮。

每当用户点击其中一个按钮时,我就会启动一个AsyncTask来在后台进行一些处理。

到目前为止这是有效的。

现在我想在此期间显示自定义ProgressDialog。这里让我感到困惑的是静态方便法ProgressDialog.show()的第一个参数。在一项活动中,我通常在这里使用“Activityname.this”。但是我应该在适配器中使用什么呢。我尝试了来自适配器(崩溃),context.getApplicationContext等的上下文。没有任何工作 - 无论是崩溃还是被编译器拒绝。

今天我的问题是:我应该在这个参数中加入什么?

这是我的代码的精简部分:

public class MyAdapter extends ArrayAdapter<MyContainer> {

  private class MyAsyncTask extends AsyncTask<String, Void, Boolean> {

    @Override
    protected void onPreExecute () {
      if (!isRunning) {
        progressDialog = MyProgressDialog.show(?????,
                                               null,
                                               null,
                                               true,
                                               false);
      }
    }

    @Override
    protected Boolean doInBackground(final String... strings) {
      boolean rc = false;

      if (!isRunning) {
        isRunning = true;
        //
        rc = true;
      }

      return rc;
    }

    @Override
    protected void onPostExecute(final Boolean result) {
      if (progressDialog != null) {
        progressDialog.cancel();
      }
      progressDialog = null;

      //    
    }
  }

  private class MyOnClickListener implements OnClickListener {

    private MyContainer container; 

    public MyOnClickListener(final MyContainer container) {
      this.container = container;
    }

    public void onClick(final View view) {
      if (container != null) {
        new MyAsyncTask().execute(container.getUrl());
      }
  }

  private String                 appName = "";
  private ArrayList<MyContainer> containers;
  private Context                context;
  private boolean                isRunning;
  private int                    layout;
  private MyProgressDialog       progressDialog;
  private Resources              resources;

  public MyAdapter(final Context context, final int layout, final ArrayList<MyContainer> containers, final long link_id) {
    super(context, layout, containers);

    this.context = context;
    this.layout = layout;
    this.containers = containers;

    resources = context.getResources();
    appName = resources.getString(R.string.txt_appname);
  }

  @Override
  public View getView(final int position, final View contentView, final ViewGroup viewGroup) {
    //
  }
}

提前致谢。

编辑:清理项目后,使用适配器中的实例变量上下文。精氨酸!谢谢你的回答。

1 个答案:

答案 0 :(得分:1)

嗨:如果你看到适配器的构造函数

,那就好了
public MyAdapter(final Context context, final int layout, final ArrayList<MyContainer> containers, final long link_id) {
    super(context, layout, containers);

    this.context = context;

您传递了上下文,因此在适配器的一侧使用上下文:D来构建进度对话框