- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您好,我在为我的问题寻找解决方案时感到很沮丧。我的问题是我有一个 gridview 来显示我从图库中选择的所有图像。我想在 gridview 中的每个图像上显示进度条。同时将图像上传到服务器使用多部分我也想更新进度条..
我在每个 ImageView 上显示了进度条,但我无法在每个进度条上显示进度。
所以请帮助我展示如何在每个 ImageView 上显示进度条及其各自的过程。
提前致谢
最佳答案
为观察者创建一个接口(interface):
interface ProgressListener {
void onProgressUpdate(String imagePath, int progress);
}
让 View 持有者实现那个观察者并知道图像路径:
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 的观察者 map ,并具有上传/下载任务调用的方法。还要添加添加和删除观察者的方法:
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 中将 View 持有者注册为观察者:
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
}
返回 View 时注册该观察者。
public View getView(final int i, View convertView, ViewGroup viewGroup) {
//other code
convertView.addOnAttachStateChangeListener(this);
return convertView;
}
最后您可以告诉 View 进度是什么:
@Override
public void transferred(long num) {
int progress = (int) ((num / (float) totalSize) * 100);
selectedAdapter.onProgressUpdate(listOfPhotos.get(i).getSdcardPath(), progress);
}
最后一个问题仍然存在,如果在上传过程中 Activity 消失了怎么办?您需要检查 Activity 是否仍然存在。也许在 onCreate 中将适配器中的标志设置为 true 并在 onDestroy 中设置为 false 就可以了。然后最后一个代码 fragment 可以检查该标志并且不再通知适配器更改。
这就是解决这个问题的基本思路。它有效吗?我不知道我是在没有任何测试的情况下从头开始写的。即使是这样,当进度为 0 或 100 时,您仍然必须管理状态。但我将其留给您。此外,您可能想要更改 recyclerView 的 BaseAdapter,以便我们可以摆脱 View.addOnAttachStateChangeListener。
关于Android:如何在向服务器发送多个图像时在 gridview 中的每个 ImageView 上显示进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38007805/
我是一名优秀的程序员,十分优秀!