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>

请告诉我如何解决这个问题。我已经搜索了有关此职位问题的所有问题,但无法解决。

4

1 回答 1

0

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

于 2014-07-09T20:19:25.287 回答