我有一个ListView
附加到一个ArrayAdapter
。当用户单击某个项目的下载按钮时ListView
下载开始使用DownloadManager
.
我想要做的是用进度条(放置在项目布局中)跟踪下载进度。如何才能实现这一目标?
Pocket Cast 的做法正是我所追求的:
Pocket Cast 示例 http://www.mrcrab.net/images/thumb_big/9982-Pocket_Casts_Apk_v4.3.2_Android-0.jpg http://www.mrcrab.net/images/thumb_big/9982-Pocket_Casts_Apk_v4.3.2_Android-0.jpg
注意:我知道如何使用DownloadManager
,棘手的是进度条的即时更新。
这是我最终解决它的方法(经过多次迭代和不同的实现)。这有点棘手,但基本上你需要三件事:
- 收集元数据的 AsyncTask
- 一个滚动侦听器,告诉我们用户何时停止滚动/滑动
- 一种巧妙的算法,可以找到任何需要更新的可见行,并要求适配器仅更新该特定行
这是我设计和实现的方式:
我写了更详细的内容it here http://slidese.github.io/slidese/2013/11/25/update_listview_item.html,请参阅github代码 https://github.com/slidese/SGU/blob/3be1888115ba56b4a015b127b249c35af5dc11d0/src/se/slide/sgu/ContentFragment.java以便完整实施。
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
}
}
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)