0

誰かが私にこれを手伝ってくれるなら、私はとても感謝しています:)

カスタム アダプター (拡張 ArrayAdapter) があり、それが表示するオブジェクト (movieDatas) には、時間と共に変化するプロパティ (downloadProgress) があります。

私はこのアダプターを複数の場所で使用しているため、CustomAdapter がすべての movieDatas.downloadProgress プロパティをリッスンし、それ自体を更新できるかどうか疑問に思いました。したがって、アクティビティからArrayAdapter.notifyDataSetChanged を使用するのではなく、アダプタが更新を決定します。

以前は、5 秒ごとに myListView.invalidate() を呼び出すすべてのアクティビティでタイマーを使用していましたが、アダプターが変更を単独で処理できるかどうか疑問に思っていました。

助けてくれてありがとう、私はアンドロイド開発から始めます。

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) カスタム アダプターの add メソッドをオーバーライドする

@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 に答える