2012-11-20 7 views
0

Я буду очень признателен, если кто-то может помочь мне один такой :)Android возможно обновление CustomAdapter сам по себе

У меня есть пользовательский адаптер (расширение ArrayAdapter), а также на объектах, он отображает (movieDatas), есть свойство, которое меняется со временем (downloadProgress)

Поскольку я использую этот адаптер в нескольких местах, я задавался вопросом, возможно ли для моего CustomAdapter прослушать каждое свойство movieDatas.downloadProgress, а затем обновить его? Таким образом, не используя ArrayAdapter.notifyDataSetChanged от активность, но адаптер принял решение обновить сам по себе.

Раньше я использовал таймер для каждой деятельности, которая называлась myListView.invalidate() каждые 5 секунд, но я задавался вопросом, может ли адаптер самостоятельно обрабатывать изменения?

Большое спасибо за помощь, я начинаю разработку Android.

ответ

1

Я не знаю, как вы это делаете, но похоже, что вы можете полностью использовать обратный вызов для его реализации.

1) Создайте интерфейс, как это:

public interface OnDownloadProgressChangeListener{ 
    public void onProgress(int progress); 
} 

2) Добавьте к вашему MovieData объекта:

// We use an ArrayList because you could need to listen to more than one event. If you are totally sure you won't need more than one listener, just change this with one listener 
private ArrayList<OnDownloadProgressChangeListener> listeners = new ArrayList<OnDownloadProgressChangeListener>(); 

public void addDownloadProgressChangeListener(OnDownloadProgressChangeListener listener){ 
    listeners.add(listener); 
} 

public void clearDownloadProgerssChangeListeners(){ 
    listeners.clear(); 
} 

//Add any handlers you need for your listener array. 


// ALWAYS use this method to change progress value. 
public void modifyProgress(int howMuch){ 
    progress+=howMuch; 
    for (OnDownloadProgressChangeListener listener : listeners) 
      listener.onProgress(progress); 
} 

3) Override ваш пользовательский метод адаптер добавить

@Override 
public void add(final MovieData item){ 
    item.addDownloadProgressChangeListener(new OnDownloadProgressChangeListener(){ 
     public void onProgress(final int progress){ 
      // Add your logic here 
      if (progress == 100){ 
        item.update(); 
      } 
     } 
    }); 
    super.add(item); 
} 

4) Всякий раз, когда предмет изменяется, вызовите notifyDataSetChanged() на свой адаптер. Вы даже можете добавить его после строки super.add(item) в реализации add, но это крайне неэффективно, если вы собираетесь добавить много элементов: сначала добавьте их, затем сообщите об изменениях.

+0

Отредактировано, забыли называть super.add (item) для добавления переопределенного метода. – razielsarafan

Смежные вопросы