2013-03-28 3 views
1

Я пытаюсь обновить ListView из AsyncTask. У меня есть такая ситуация:android - Обновление ListView из AsyncTask, вызванное из пользовательского класса адаптера

  • Класс деятельности создает адаптер списка из пользовательского класса адаптера.
  • Класс адаптера устанавливает onClickListener на элемент из элемента списка и вызывает AsyncTask, расположенный в другом классе Утилиты.

Как я могу вызвать notifyDataSetChanged из метода onPostExecute() в утилите AsyncTask?

+0

вы отправите экземпляр адаптера, используя параметризованный конструктор класса Utilities для вызова 'notifyDataSetChanged' в' onPostExecute'. У вас так пытался? –

+0

Нет, это мой вопрос. Как я могу отправить экземпляр адаптера в конструктор класса Utilities? Я знаю, что это простой вопрос, но я застрял. –

ответ

9

Включить делегата в качестве обратного вызова для активации обновления внутри исходного класса.

Например, добавьте этот интерфейс:

public interface AsyncDelegate { 

    public void asyncComplete(boolean success); 


} 

Затем в своем классе вызывающему, реализовать интерфейс, и передать его в вашей задаче

public class MyClass implements AsyncDelegate { 

// Class stuff 
MyAsyncTask newTask = new MyAsyncTask(this); 
newTask.execute(); 

public void asyncComplete(boolean success){ 
    myAdapter.notifyDataSetChanged(); 

} 

В AsyncTask, возвращает результат:

private class MyAsyncTask extends AsyncTask<Object, Object, Object> { 

    private AsyncDelegate delegate; 

    public MyAsyncTask (AsyncDelegate delegate){ 
    this.delegate = delegate; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     delegate.asyncComplete(true); 
    } 

} 

Когда задача завершена, она вызовет делегат, что вызовет рефрен час!

+0

Спасибо, это именно то, что я искал. –

0

Вот пример:

Круг семьи является ArrayList. nAdapter - это универсальный адаптер.

Итак, сначала вы очищаете свой список, а затем добавляете все свое новое содержание. После этого вы скажете своему адаптеру, что ваш контент был изменен.

@Override 
     protected void onPostExecute(ArrayList<HashMap<String, String>> list) { 

     newsList.clear(); 
      newsList.addAll(list); 
      nAdapter.notifyDataSetChanged(); 


     } 
+0

Спасибо, я знаю, что я должен вызвать notifyDataSetChanged() в методе onPostExecute(). Проблема в том, что я не знаю, как передать экземпляр адаптера в AsyncTask, потому что он не в одном классе. Если бы они были, я мог бы просто создать глобальную переменную адаптера, которую я мог бы вызвать в AsyncTask. –

+0

вам не нужно передавать адаптер в asynctask, вам нужно просто создать переменную точно так же, как вы сказали. – Marckaraujo