GetView跳过要显示的第一张图像,因为位置0重复了三次



我正在尝试加载图像在我的画廊从Url使用延迟加载和一切工作正常。它显示一个ProgressBar,直到图像加载,当图像从站点加载时消失。我已经尝试了所有的方式,但它跳过第一个图像加载,并按照我的要求完美地显示剩余的图像。我已经检查了日志,结果是getView方法显示position 0 0 0 1 0 0 0 1,如果我有两个图像,所以它不显示第一个图像,因为它同时调用三次,导致它在加载之前重新加载。所以我的问题是为什么它一次调用三次。我已经搜索了许多关于这方面的问题,但有序列是0 1 0 1,这不是问题。为什么会发生这种情况?

下面是我的一些代码。

这是我的自定义ImageView
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;
public class WebImageView extends ImageView {
    private Drawable image;
    private ProgressBar placeholder;
    public WebImageView(Context context) {
        super(context);
    }
    public WebImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }
    public WebImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public void setPlaceholderImage(int resid) {
        View view = (View)this.getParent();
        placeholder = (ProgressBar)view.findViewById(resid);
        if (image == null) {
            placeholder.setVisibility(View.VISIBLE);
        }
    }
    @SuppressWarnings("deprecation")
    public void setIt(Bitmap result){
        image = new BitmapDrawable(result);
        if (image != null) {
            try{Thread.sleep(2000);}catch(Exception e){}
            placeholder.setVisibility(View.GONE);
            setImageDrawable(image);
        }
    }
}

我的CustomAdapter

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import com.smartsync.ImageCache;
import com.smartsync.R;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Toast;
public class ImageAdapter extends ArrayAdapter<URL> {
    private Activity activity;
    private int layoutResourceId;
    private ArrayList<URL> data = new ArrayList<URL>();
    ExecutorService exec;
    private ImageCache cache;
    public ImageAdapter(Context context, int layoutResourceId, ArrayList<URL> data) {
        super(context, layoutResourceId, data);
        this.layoutResourceId = layoutResourceId;
        this.activity = (Activity)context;
        exec = Executors.newSingleThreadExecutor();
        this.data = data;
        this.cache = new ImageCache(context);
    }
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View row = convertView;
        final URL url = data.get(position);
        final WebImageView image;
        if (row == null) {
            row = activity.getLayoutInflater().inflate(layoutResourceId, parent, false);
            image = (WebImageView) row.findViewById(R.id.webimage);
            image.setPlaceholderImage(R.id.pbar);
            this.notifyDataSetChanged();
            row.setTag(image);
        }
        else
            image = (WebImageView) row.getTag();
        final ImageAdapter adapter = this;
        /*if(position == 0){
            row.setVisibility(View.GONE);
            return row;
        }*/
        exec.execute(new Runnable(){            
            @Override
            public void run() {
                try {
                    Bitmap bitmap = null;
                    bitmap = cache.getBitmap(url);
                    if(bitmap == null){
                        BitmapFactory.Options options = new BitmapFactory.Options();
                        options.inPurgeable = true;
                        options.outHeight = 100;
                        options.outWidth = 100;
                        options.inSampleSize = 5;
                        bitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream(), null, options);
                        cache.setCache(bitmap, url);
                    }
                    final Bitmap bmp = bitmap;
                    activity.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            image.setIt(bmp);
                            adapter.notifyDataSetChanged();
                        }
                    });
                } catch (Exception e) {
                    Log.i("test", ""+e);
                }   
            }
        });
        return row;
    }
}

这是单行的布局。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="5dp"
    android:orientation="vertical"
    android:padding="5dp" 
    android:clickable="true"
    android:focusable="true">
    <com.smartsync.adapters.WebImageView
        android:id="@+id/webimage"
        android:background="@xml/border"
        android:cropToPadding="true"
        android:scaleType="centerCrop"
        android:padding="3dip"
        android:adjustViewBounds="true"
        android:layout_width="100dp"
        android:layout_height="100dp" />
    <ProgressBar 
       android:id="@+id/pbar"
       style="?android:attr/progressBarStyleLarge"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_centerInParent="true" />
</RelativeLayout>
请告诉我如何解决这个问题。我已经搜索了关于这个职位问题的所有问题,但都无法解决这个问题。

我自己又找到了原因。问题是我在getView()中调用this.notifyDataSetChanged();,这导致再次绘制,因此开始加载自身导致问题。我刚刚去掉了这条线。我不需要这个,因为这一行是在我们改变数据集的数量时使用的,但在我的例子中,这些已经加载了。删除进度条和加载图像不是这一行的任务。

最新更新