ListView
にArrayAdapter
が添付されています。ユーザーがListView
内のアイテムのダウンロードボタンをクリックすると、ダウンロードはDownloadManager
の使用を開始します。
私がやりたいのは、プログレスバー(アイテムレイアウトに配置)を使用してダウンロードの進行状況を追跡することです。これはどのように達成できますか?
Pocket Castのやり方は、まさに私が求めているものです。
ポケットキャストの例http://www.mrcrab.net/images/thumb_big/9982-Pocket_Casts_Apk_v4.3.2_Android-0.jpg
注:DownloadManager
の操作方法を知っています。注意が必要なのは、プログレスバーの即時更新です。
これは私が最終的にそれを解決した方法です(多くの反復と異なる実装の後)。少し注意が必要ですが、基本的に3つのことが必要です。
これは私がそれを設計して実装した方法です:
ここにあります について詳しく書きました。完全な実装については、 githubコード を参照してください。
private class UpdaterAsyncTask extends AsyncTask<Void, Void, Void> {
boolean isRunning = true;
public void stop() {
isRunning = false;
}
@Override
protected Void doInBackground(Void... params) {
while (isRunning) {
// Gather data about your adapter objects
// If an object has changed, mark it as dirty
publishProgress();
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
@Override
protected void onProgressUpdate(Void... params) {
super.onProgressUpdate();
// Update only when we're not scrolling, and only for visible views
if (mScrollState == OnScrollListener.SCROLL_STATE_IDLE) {
int start = mListview.getFirstVisiblePosition();
for(int i = start, j = mListview.getLastVisiblePosition(); i<=j; i++) {
View view = mListview.getChildAt(i-start);
if (((Content)mListview.getItemAtPosition(i)).dirty) {
mListview.getAdapter().getView(i, view, mListview); // Tell the adapter to update this view
}
}
}
}
}
特定のビューアイテムについては、 getChildAt(int index) を使用して取得し、更新できます。
そして、 getFirstVisiblePosition() および getLastVisiblePosition() を使用して、表示されているすべてのアイテムをトラバースできます。