gpt4 book ai didi

Android:如何在向服务器发送多个图像时在 gridview 中的每个 ImageView 上显示进度条

转载 作者:行者123 更新时间:2023-11-29 01:18:59 26 4
gpt4 key购买 nike

您好,我在为我的问题寻找解决方案时感到很沮丧。我的问题是我有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com