嗨我在搜索我的问题的解决方案时感到沮丧。我的问题是我有一个gridview来显示我从gallery中选择的所有图像。我想在gridview中的每个图像上显示进度条。并在使用图像上传图像到服务器时multipart我想要更新进度条..
我在每个图片视图上显示了进度条,但我无法在每个进度条上显示进度。
所以请帮我展示如何在每个图像视图中显示进度条及其各自的过程。
提前致谢
答案 0 :(得分:1)
为观察者创建一个界面:
interface ProgressListener {
void onProgressUpdate(String imagePath, int progress);
}
让视图持有者实现该观察者并知道图像路径:
public class ViewHolder implements ProgressListener {
ImageView imgQueue;
ProgressBar pb;
TextView tv;
String imagePath; //set this in getView!
void onProgressUpdate(String imagePath, int progress) {
if (!this.imagePath.equals(imagePath)) {
//was not for this view
return;
}
pb.post(new Runnable() {
pb.setProgress(progress);
});
}
//your other code
}
适配器应保存特定图像路径/ uri的观察者映射,并具有上载/下载任务调用的方法。还添加了添加和删除观察者的方法:
public class SelectedAdapter_Test extends BaseAdapter {
private Map<String, ProgressListener> mProgressListener = new HashMap<>();
//your other code
synchronized void addProgressObserver(String imagePath, ProgressListener listener) {
this.mListener.put(imagePath, listener);
}
synchronized void removeProgressObserver(String imagePath) {
this.mListener.remove(imagePath);
}
synchronized void updateProgress(String imagePath, int progress) {
ProgressListener l = this.mListener.get(imagePath);
if (l != null) {
l.onProgressUpdate(imagePath, progress);
}
}
//other code
}
在适配器的getView中,将视图持有者注册为观察者:
public View getView(final int i, View convertView, ViewGroup viewGroup) {
//other code
holder.imagePath = data.get(i).getSdcardPath();
this.addProgressObserver(holder.imagePath, holder);
return convertView;
}
现在的问题是,我们注册了观察者,但没有取消注册。所以让适配器实现View.addOnAttachStateChangeListener:
public class SelectedAdapter_Test extends BaseAdapter implements View.addOnAttachStateChangeListener {
//other code
void onViewAttachedToWindow(View v) {
//We ignore this
}
void onViewDetachedFromWindow(View v) {
//View is not visible anymore unregister observer
ViewHolder holder = (ViewHolder) v.getTag();
this.removeProgressObserver(holder.imagePath);
}
//other code
}
返回视图时注册该观察者。
public View getView(final int i, View convertView, ViewGroup viewGroup) {
//other code
convertView.addOnAttachStateChangeListener(this);
return convertView;
}
最后,您可以告诉观点进展情况:
@Override
public void transferred(long num) {
int progress = (int) ((num / (float) totalSize) * 100);
selectedAdapter.onProgressUpdate(listOfPhotos.get(i).getSdcardPath(), progress);
}
最后一个问题仍然存在,如果在上传过程中活动消失了怎么办?您需要检查活动是否仍然存在。也许在onCreate中将适配器中的标志设置为true,而在onDestroy中将其设置为false就可以了。然后最后一个代码片段可以检查该标志,并且不再通知适配器更改。
那基本上就是如何解决这个问题的想法。它有用吗?我不知道我是在没有任何测试的情况下从头开始编写的。即使它确实如此,当进度为0或100时,你仍然必须管理状态。但我把它留给你。此外,您可能希望更改RecyclerView的BaseAdapter,以便我们可以摆脱View.addOnAttachStateChangeListener。
答案 1 :(得分:0)
- 在适配器类中添加布尔值
public SelectedAdapter_Test(Context c, ArrayList<CustomGallery> data, boolean showProgress) {
mContext = c;
inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.data = data;
this.showProgress = showProgress;
}
- Adapter类getView中的更改
holder.pb = (ProgressBar) convertView.findViewById(R.id.progressbar);
if (showProgress)
holder.pb.setVisibility(View.VISIBLE);
else
holder.pb.setVisibility(View.GONE);
- 在
中进行更改doFileUpload
private void doFileUpload(View v) {
View vi = v;
for (i = 0; i < listOfPhotos.size(); i++) {
<--your task-->
}
//**important**
SelectedAdapter_Test mTest = new SelectedAdapter_Test(context,data,false);
// set above adapter object respectively;
mList.setadapter(mTest);
}
FYI。设置适配器时第一次将showProgress值传递为true。