如果有人可以帮助我,我将非常感激:)
我有一个自定义适配器(扩展ArrayAdapter),并且在它显示的对象(movieDatas)上,有一个随时间变化的属性(downloadProgress)
由于我在多个地方使用此适配器,我想知道我的 CustomAdapter是否可以侦听每个movieDatas.downloadProgress属性,然后自行更新?因此,不使用ArrayAdapter.notifyDataSetChanged < strong>来自活动,但适配器会自行决定更新。
以前,我在每5秒调用myListView.invalidate()的每个Activity上都使用了一个Timer,但我想知道适配器是否可以自己处理这些更改?
非常感谢你的帮助,我从android开发开始。
答案 0 :(得分: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
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
行之后添加它,但如果您要添加大量项目,则效率非常低:先添加它们然后通知更改。