0

如果有人可以帮助我,我将不胜感激:)

我有一个自定义适配器(扩展 ArrayAdapter),在它显示的对象(movieDatas)上,有一个随时间变化的属性(downloadProgress)

由于我在多个地方使用此适配器,我想知道我的CustomAdapter 是否有可能监听每个 movieDatas.downloadProgress 属性,然后自行更新?因此,不使用活动中的ArrayAdapter.notifyDataSetChanged ,但适配器会自行决定更新。

以前,我在每 5 秒调用一次 myListView.invalidate() 的每个 Activity 上使用 Timer,但我想知道适配器是否可以自己处理更改?

非常感谢您的帮助,我是从android开发开始的。

4

1 回答 1

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,但是如果您要添加很多项目,这将非常低效:先添加它们然后通知更改。

于 2012-11-20T09:57:13.203 回答