我有一个listview,每个项目都有一个ProgressBar。我自己创建的线程在后台运行和下载数据,并且必须在每个项目的getView部分显示下载进度,但是我无法在适配器的getView方法中更新setProgressbar。
但是当用户上下滚动(远离特定视图)时,它会根据下载百分比更新进度并冻结而不会增加。
我的主题代码
downloading = Ion.with(LoadTumblrActivity.this)
.load(item.getGifUrl())
// can also use a custom callback
// can also use a custom callback
.progress(new ProgressCallback() {
@
Override
public void onProgress(long downloaded, long total) {
float progressVal = ((float) downloaded / (float) total);
item.setProgress((int)(100 * progressVal));
}
})
.write(
new File(Environment.getExternalStorageDirectory().getPath() + "/sdcard" + fileName))
.setCallback(new FutureCallback < File > () {
@
SuppressLint("SdCardPath")@ Override
public void onCompleted(Exception e, File file) {
{
if (e != null) {
Toast.makeText(LoadTumblrActivity.this, "Error downloading file", Toast.LENGTH_LONG).show();
System.out.println(e);
return;
}
}
}
});
我的BaseAdapter
public View getView(int position, View convertView, ViewGroup parent) {
View rowView = convertView;
// reuse views
if (rowView == null) {
LayoutInflater inflater = activity.getLayoutInflater();
rowView = inflater.inflate(R.layout.feed_item, parent, false);
// configure view holder
ViewHolder viewHolder = new ViewHolder();
viewHolder.progressBar = (ProgressBar) rowView.findViewById(R.id.progress);
rowView.setTag(viewHolder);
}
holder.progressBar.setProgress(item.getProgress());
}
答案 0 :(得分:1)
你的问题是你打电话
holder.progressBar.setProgress(item.getProgress());
在getView
和getView
内的仅针对屏幕上显示的项目进行调用。这就是为什么你的ProgressBar
仅在滚动滚动来到屏幕的项目时更新!当您在getView
中致电AsyncTask
时,您需要在publishProgress();
之外的onProgressUpdate
内拨打此行,以便让用户真实体验到项目出现/完成下载。
另一种方法是将progressBar设置为intermediate= "false"
并仅显示旋转进度条! ;)
希望有所帮助
答案 1 :(得分:0)
使用runOnuiThread更新进度条:
runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
progressDialog.setMessage(ii+" Apps Loaded...");
ii++;
}
});
来自Helper+
的源代码