Используйте пользовательский ProgressDialog во время AsyncTask в Adapter - PullRequest
0 голосов
/ 24 августа 2011

Я использую 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) {
    //
  }
}

Заранее спасибо.

РЕДАКТИРОВАТЬ : Использование контекста переменной экземпляра из адаптера работало после очистки проекта. Arg! Спасибо за ваши ответы.

1 Ответ

1 голос
/ 24 августа 2011

Привет: D хорошо, если вы видите ваш конструктор адаптера

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

    this.context = context;

вы передаете контекст, поэтому на стороне адаптера вы используете контекст: D для построения диалога прогресса

...