Android 每个gridview项目中的Progressbar

Android 每个gridview项目中的Progressbar,android,gridview,progress-bar,Android,Gridview,Progress Bar,我有一个显示图像和进度条的gridview。每个项目都包含进度条,并在相应的文件下载时显示进度。滚动gridview时,进度条反复显示错误项目的进度,我使用的是viewholder。请给我一个解决方案 public View getView(int position, View convertView, ViewGroup parent) { View vi=convertView; if(convertView==null) vi = inflater.inflate

我有一个显示图像和进度条的gridview。每个项目都包含进度条,并在相应的文件下载时显示进度。滚动gridview时,进度条反复显示错误项目的进度,我使用的是viewholder。请给我一个解决方案

public View getView(int position, View convertView, ViewGroup parent) {
    View vi=convertView;
    if(convertView==null)
     vi = inflater.inflate(R.layout.rowimage, null);

    ImageView image=(ImageView)vi.findViewById(R.id.ivv); 
    ProgressBar pb= (ProgressBar)vi.findViewById(R.id.pb); 
    display(image, data.get(position).toString(), pb);
    //imageLoader.displayImage(data.get(position).toString(), image,options);

    return vi;
}

  public void display(ImageView img, String url, final ProgressBar spinner)
   {
    imageLoader.displayImage(url, img, options, new ImageLoadingListener() {
        @Override
        public void onLoadingStarted(String imageUri, View view) {
         spinner.setVisibility(View.VISIBLE);
        }
        @Override
        public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
         spinner.setVisibility(View.GONE);

        }
        @Override
        public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
         spinner.setVisibility(View.GONE);
        }
        @Override
        public void onLoadingCancelled(String imageUri, View view) {

        }

});
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"

android:orientation="vertical" >

<ImageView
    android:id="@+id/ivv"
    android:layout_gravity="center"
    android:layout_width="300dp"
    android:layout_height="300dp"

    />
<ProgressBar 
    android:id="@+id/pb"
    android:layout_centerInParent="true"
    android:layout_gravity="center"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

 </RelativeLayout>
我已经使用了上述通用图像加载器。将在中心显示存根图像和进度对话框。一旦图像被下载。图像设置为imageview,进度对话框消失

您可以看到生成的快照。我已将上述内容用于listview。gridview也应该如此。出于测试目的,我使用了默认的启动器映像。但可以删除螺柱图像,自定义进度对话框


问题在于,当您的
ProgressBar
对象滚动到屏幕外时,系统会任意重用它们

这意味着当一个
ProgressBar
滚动到屏幕外时,当该项目出现时,它将在新的网格位置重新使用


解决办法相当简单。在
getView()
中,必须设置每个
ProgressBar的进度值和可见性(如果在不使用时隐藏它们),而不考虑下载状态。为此,您将保存每个网格位置的进度值和下载状态,您可能已经有了这些信息。

请发布您的代码。。。我从你的回答中得到了答案。你能建议在下载时显示进度吗。。。提前感谢。下面是一个示例,演示如何在增量读取数据时下载和更新
ProgressBar
:。即使您没有使用
AsyncTask
管理下载,此示例也很好。重要的部分是更新
while(input.read())
循环中的
ProgressBar
。对我来说,难点在于如何升级进度值。因为NOTIFYDATASETCHANGE将更新所有单元格,这显然是不可接受的。
 File cacheDir = StorageUtils.getOwnCacheDirectory(a, "UniversalImageLoader/Cache");


 // Get singletone instance of ImageLoader
   imageLoader = ImageLoader.getInstance();
 // Create configuration for ImageLoader (all options are optional)
    ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(a)
              // You can pass your own memory cache implementation
             .discCacheExtraOptions(1024, 1024, CompressFormat.PNG, 100)
             .discCache(new UnlimitedDiscCache(cacheDir)) // You can pass your own disc cache implementation
             .discCacheFileNameGenerator(new HashCodeFileNameGenerator())
             .enableLogging()
             .build();
 // Initialize ImageLoader with created configuration. Do it once.
 imageLoader.init(config);
    //imageLoader.init(ImageLoaderConfiguration.createDefault(a));
   // imageLoader=new ImageLoader(activity.getApplicationContext());
    options = new DisplayImageOptions.Builder()
    .showStubImage(R.drawable.ic_launcher)
    .cacheInMemory()
    .cacheOnDisc()
    .displayer(new RoundedBitmapDisplayer(20))
    .build();