ProgressDialog не отображается в методе onListItemClick моего ListActivity - PullRequest
2 голосов
/ 15 июня 2011

У меня ListActivity с BaseAdapter.Каждый раз, когда пользователь щелкает элемент, я очищаю адаптер и перезагружаю новый контент (это своего рода древовидная логика).

Иногда требуется несколько секунд, чтобы адаптер получил новый список элементов в onListItemClick().Я хотел бы показать индикатор выполнения при вводе onListItemClick() и скрыть его после завершения.

Почему диалоговое окно прогресса не отображается в моем примере?Я подозреваю (как я читал), проблема была бы, потому что "расчет" не выполняется в фоновом потоке?Если да, то можете ли вы дать мне пример, основанный на моем коде?

Вот код:

protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);

    catalogAdapter.previousUrl = catalogAdapter.currentUrl;
    RRmlMappingServicesCatalogItem item = catalogAdapter.getItem(position);
    catalogAdapter.currentUrl = item.href;
    //catalogAdapter.mappingServicesCatalog.loadFromRml(new RIoConnectionManagerImpl(this.getApplicationContext()), item.href, null, 120000, 500000);
    loadCatalogFromRml(this.getApplicationContext(), item.href);
    catalogAdapter.clearData();

    if ((catalogAdapter.mappingServicesCatalog.getFlatItems()).length == 0)
    {
        catalogAdapter.mappingServiceContent = new RRmlMappingServiceContent ();
        this.loadContentFromRml(this.getApplicationContext(), item.href);
        //catalogAdapter.mappingServiceContent.loadFromRml(new RIoConnectionManagerImpl(this.getApplicationContext()),item.href, null, 120000, 500000);
        settings = (GlobalSettings) getApplication();
        settings.setMappingServiceContent(catalogAdapter.mappingServiceContent);
        if (catalogAdapter.mappingServiceContent.authentication != null)
        {
            startActivity(new Intent(CatalogActivity.this,
                LoginActivity.class));
        }
        else
        {
            startActivity(new Intent(CatalogActivity.this,
                    MapActivity.class));
        }
    }
    else
    {
        for (RRmlMappingServicesCatalogItem s : catalogAdapter.mappingServicesCatalog.getFlatItems()) {
            catalogAdapter.addItem(s);
        }
        setListAdapter(catalogAdapter);
    }
}

public void loadContentFromRml(Context context, final String url)
{
    final Context myContext = context;
    final String myUrl = url;

        progressDialog = ProgressDialog.show(CatalogActivity.this, "",
            "Loading content...", true);

    new Runnable()
    {       
        public void run() 
        {
            catalogAdapter.mappingServiceContent.loadFromRml(new RIoConnectionManagerImpl(myContext),myUrl, null, 120000, 500000);
            progressDialog.dismiss();
        }
    }.run();
}

public void loadCatalogFromRml(Context context, String url)
{
    final Context myContext = context;
    final String myUrl = url;

        progressDialog = ProgressDialog.show(CatalogActivity.this, "",
            "Loading catalog...", true);

    new Runnable()
    {       
        public void run() 
        {
            catalogAdapter.mappingServicesCatalog.loadFromRml(new RIoConnectionManagerImpl(myContext), myUrl, null, 120000, 500000);
            progressDialog.dismiss();
        }
    }.run();
}

Ответы [ 3 ]

2 голосов
/ 15 июня 2011

Я подозреваю, что самая занятая строка вашего кода следующая:

catalogAdapter.mappingServicesCatalog.loadFromRml(...);

Для отображения диалогового окна необходимо вернуться из функции, вызвавшей ProgressDialog.show(...). Это потому, что фактическая обработка этого вызова выполняется в цикле сообщений (этот цикл вызывал вашу функцию в первую очередь). Таким образом, в вашем коде вы создаете диалог и помечаете его для показа, но никогда не даете ему возможности показать себя, вызывая .dismiss() в конце той же функции.

Вы должны использовать AsyncTask. Во-первых, вам нужно отделить код обработки пользовательского интерфейса от вашей loadFromRml функциональности. Поместите все, что отнимает много времени, в doInBackground функцию AsyncTask, весь пользовательский интерфейс должен быть либо onPreExecute, либо onPostExecute.

Вы можете отобразить диалог прогресса в функции onListItemClick и отклонить его в функции AsyncTask.onPostExecute. Или, в качестве альтернативы, показать диалог прогресса в AsyncTask.onPreExecute и скрыть его в AsyncTask.onPostExecute.

Существует множество примеров с AsyncTask, один из которых находится в AsycnTask android docs . Другая полезная статья может быть найдена в ресурсах разработчика Android: Безболезненная Threading .

0 голосов
/ 15 июня 2011
    progressDialog = ProgressDialog.show(CatalogActivity.this, "",
                "Please wait for few seconds...", true);

    runOnUIThread(new Runnable()
    {


public void run()
  {
      //Do you task here 
       progressDialog.dismiss();


 }
    });

Если вы найдете это полезным, пожалуйста, не забудьте пометить его как ответ

С наилучшими пожеланиями,

~ Anup

0 голосов
/ 15 июня 2011

Я также столкнулся с таким же типом состояния в моем приложении, но я решил его, используя данный код, код которого он есть.

Я создал свой диалог прогресса, подобный этому

final ProgressDialog dialogMatchList = ProgressDialog
            .show(TennisAppActivity.mContext, "",
                    "Loading. Please wait...", true);
    dialogMatchList.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    dialogMatchList.setIndeterminate(true);
    dialogMatchList.setCancelable(true);

когда диалоговое окно прогресса закрывается, вызывается функция удара

dialogMatchList.setOnDismissListener(new OnDismissListener() {

        public void onDismiss(DialogInterface arg0) {

            list.setAdapter(new EfficientAdapter(getApplicationContext()));

        }
    });

Я надеюсь, что это помощь,

...