作为程序猿,尤其是开发android的猿,习惯了在网络上查抄各种解决方案,并且很希望有源码下载。真心话,我也是这样。但我还是希望猿们找到solution后能多思考,变成自己的东西。
这里我给出了关键的solution,没有给出全部源码。
Precondition:
listview中包含点击下载,显示进度条。
Question:
listview上下滚动后,进度条显示混乱,实际上是找不到正确的位置显示。
Solution:
关键在于listview的adapter的getview设置。
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
final int itemid = position;
if (row == null) {
row = mInflater.inflate(R.layout.item, null);
}
ProgressBar pb = (ProgressBar) row.findViewById(R.id.progressbar);
pb.setMax(100);
pb.setProgress(0);
pb.setTag(model.url); //将要下载的url设置为progressbar的TAG
Button bt = (Button) row.findViewById(R.id.downloadbt);
OnClickListener listener = new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
int position = itemid;
BookModel model = mModels.get(position);
model.downloadstate = "R"; //设置该项数据状态,正在下载
v.setBackgroundResource(R.drawable.pause);
BookItemAdapter.this.service.addDownloadTask(position, //点击下载,这里我用了一个service来下载。这里把postion作为taskid传给下载服务。
model.out_book_url, null, null, true);
};
}
下面来定义一个更新progressbar的函数,下载服务回传下载进度,调用updateProgress来更新progressbar。
public void updateProgress(int taskID,String filename, int fileSize, int downloadedSize){
int position = taskID;
this.mModels.get(position).size = fileSize;
this.mModels.get(position).downloadedsize = downloadedSize;
if ( downloadedSize == fileSize ){
this.mModels.get(position).downloadstate = "E";
}
int start = mListView.getFirstVisiblePosition();
int end = mListView.getLastVisiblePosition();
if (end >= getCount()) {
end = getCount() - 1;
}
if( position >= start && position <= end ){
ProgressBar view = (ProgressBar) mListView
.findViewWithTag(this.mModels.get(position).out_book_url);
if (this.mModels.get(position).downloadstate == "R") { // "R",是数据集,里面记录了某个数据正在下载
if (view != null) {
double d = (double) downloadedSize / (double) fileSize;
int percent = (int) (d * 100);
Log.d(TAG + "---", "position=" + position + " url= "
+ this.mModels.get(position).out_book_url);
view.setProgress(percent);
}
}else if(this.mModels.get(position).downloadstate == "E"){
if(view != null){
view.setProgress(100);
}
}
}
}
改进:
这里还可以override AbsListView.OnScrollListener, 其中有三个事件,
SCROLL_STATE_FLING
SCROLL_STATE_IDLE
SCROLL_STATE_TOUCH_SCROLL
可以设置一些flag,在listview 空闲的时候,显示进度,正在滚动的时候,不刷新进度。