Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在Listview中正确加载图像_Android_Android Listview_Android Arrayadapter_Android Adapter_Universal Image Loader - Fatal编程技术网

Android 在Listview中正确加载图像

Android 在Listview中正确加载图像,android,android-listview,android-arrayadapter,android-adapter,universal-image-loader,Android,Android Listview,Android Arrayadapter,Android Adapter,Universal Image Loader,我正在使用Universal Image Loader库在我的listview中加载图像,它会加载图像,但我注意到,如果您第一次快速滚动,您可以看到在加载正确图像之前先加载错误的图像 我怎样才能阻止这种影响。下面是我的全班同学 public MyListAdapter(Context context, List<VenueDetails> m_venue_details) { super(context, R.layout.venue_list_row, m_venue_de

我正在使用Universal Image Loader库在我的listview中加载图像,它会加载图像,但我注意到,如果您第一次快速滚动,您可以看到在加载正确图像之前先加载错误的图像

我怎样才能阻止这种影响。下面是我的全班同学

public MyListAdapter(Context context, List<VenueDetails> m_venue_details) {
    super(context, R.layout.venue_list_row, m_venue_details);

    this.context = context;
    this.venue_details = new ArrayList<VenueDetails>();
    this.venue_details = m_venue_details;
    df = new DecimalFormat("#.##");
}

@SuppressWarnings("deprecation")
@SuppressLint("NewApi")
@Override
public View getView(int position, View v, ViewGroup parent) {

    final ViewHolder holder;
    final VenueDetails vD =  venue_details.get(position);   

    if (inflater == null) {
        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    if (v == null) {
        v = inflater.inflate(R.layout.venue_list_row, parent,false);
        holder = new ViewHolder();
        holder.venue_name = (TextView) v.findViewById(R.id.venue_name);
        holder.venue_dist = (TextView) v.findViewById(R.id.venue_dist);
        holder.curr_loc = (TextView) v.findViewById(R.id.curr_loc);
        holder.ll = (FrameLayout) v.findViewById(R.id.venue_frame);
        holder.pett_btn = (Button) v.findViewById(R.id.venue_pett);
        holder.img = (ImageView) v.findViewById(R.id.venue_logo);

        v.setTag(holder);

    }else{
        holder = (ViewHolder) v.getTag();
    }

    holder.img.setTag(vD.logo);

    if(vD.list_img == null){
        myAppObj.getImageLoader().loadImage(holder.img.getTag().toString(), new ImageLoadingListener() {

            @Override
            public void onLoadingStarted(String imageUri, View view) {
                holder.img.setBackgroundResource(R.drawable.placeholder_venue);
            }

            @Override
            public void onLoadingFailed(String imageUri, View view,
                    FailReason failReason) {    
                holder.img.setBackgroundResource(R.drawable.placeholder_pin);                   
            }

            @Override
            public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
                holder.img.setBackgroundDrawable(new BitmapDrawable(loadedImage));
                if(vD.list_img == null){
                    vD.list_img = new BitmapDrawable(loadedImage);
                }
            }

            @Override
            public void onLoadingCancelled(String imageUri, View view) {
                holder.img.setBackgroundResource(R.drawable.placeholder_venue);
            }
        });
    }else{
        holder.img.setBackgroundDrawable(vD.list_img);
    }

    if(vD != null){         

        holder.venue_name.setText(vD.venueName.toUpperCase());
        venue_details.get(position).venue_distance = Double.parseDouble(df.format(Utils.distance(myAppObj.getMyLatitude(), myAppObj.getMyLongitude(), vD.latitude, vD.longitude, 'K') * 0.000621371192));
        holder.venue_dist.setText(df.format(vD.venue_distance)+" Miles");


        holder.venue_curr_loc.setText(my_address.toUpperCase());

        if (vD.petted == 1) {

            holder.pett_btn.setVisibility(View.VISIBLE);
            holder.ll.setVisibility(View.VISIBLE);

            holder.pett_btn.setOnClickListener(new OnClickListener() {
                @Override               
                public void onClick(View v) {                   
                    if(dialog_Callback!=null)
                        dialog_Callback.onDialogCalled(0, vD.id);
                }
            });

        } else {

            holder.pett_btn.setVisibility(View.GONE);
            holder.ll.setVisibility(View.GONE);
        }           
    }

    return v;
}

@Override
public boolean isEnabled(int position) {
    if (venue_details.get(position).petted == 1) {
        return false;
    } else {
        return true;
    }
}

static class ViewHolder{
    TextView venue_name;
    TextView venue_dist;
    TextView venue_curr_loc;
    FrameLayout ll;
    Button pett_btn;
    ImageView img;
}
公共MyListAdapter(上下文,列出m_场馆的详细信息){
超级(上下文、右布局、场馆列表、m场馆详细信息);
this.context=上下文;
this.vention_details=new ArrayList();
this.vention\u details=m\u vention\u details;
df=新的十进制格式(“#.##”);
}
@抑制警告(“弃用”)
@SuppressLint(“新API”)
@凌驾
公共视图getView(内部位置、视图v、视图组父视图){
最终持票人;
最终场馆详细信息vD=场馆详细信息。获取(位置);
如果(充气器==null){
充气器=(充气器)上下文
.getSystemService(上下文布局\充气机\服务);
}
如果(v==null){
v=充气机。充气(R.layout.Visite\u list\u row,父级,false);
holder=新的ViewHolder();
holder.venture\u name=(TextView)v.findViewById(R.id.venture\u name);
holder.venue\u dist=(文本视图)v.findViewById(R.id.venue\u dist);
holder.curr\u loc=(文本视图)v.findviewbyd(R.id.curr\u loc);
holder.ll=(框架布局)v.findViewById(R.id.venue_框架);
holder.pett\u btn=(按钮)v.findViewById(R.id.vention\u pett);
holder.img=(ImageView)v.findViewById(R.id.Visue_徽标);
v、 setTag(支架);
}否则{
holder=(ViewHolder)v.getTag();
}
支架.图像设置标签(vD.徽标);
如果(vD.list\U img==null){
myAppObj.getImageLoader().loadImage(holder.img.getTag().toString(),new ImageLoadingListener()){
@凌驾
public void onLoadingStarted(字符串imageUri,视图){
持有者。img.挫折背景资源(R.可绘制。占位符\场地);
}
@凌驾
public void onload失败(字符串imageUri、视图、,
失效原因失效原因{
支架.img.立根资源(R.可绘制.占位符\U销);
}
@凌驾
public void onLoadingComplete(字符串imageUri、视图视图、位图加载图像){
holder.img.setBackgroundDrawable(新位图可绘制(LoadeImage));
如果(vD.list\U img==null){
vD.list_img=新位图可绘制(LoadeImage);
}
}
@凌驾
public void onLoadingCancelled(字符串imageUri,视图){
持有者。img.挫折背景资源(R.可绘制。占位符\场地);
}
});
}否则{
支架img可缩位拉深(vD.list\U img);
}
如果(vD!=null){
holder.vention_name.setText(vD.venueName.toUpperCase());
venue_details.get(position).venue_distance=Double.parseDouble(df.格式(Utils.distance(myAppObj.getMyLatitude(),myAppObj.getMyLongitude(),vD.纬度,vD.经度,'K')*0.000621371192);
场地距离设置文本(df.格式(vD.场地距离)+“英里”);
holder.Visition\u curr\u loc.setText(my_address.toUpperCase());
如果(vD.petted==1){
保持架.pett_btn.设置可见性(视图.可见);
holder.ll.setVisibility(视图可见);
holder.pett_btn.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
如果(对话框_回调!=null)
dialog\u Callback.onDialogCalled(0,vD.id);
}
});
}否则{
holder.pett_btn.setVisibility(视图已消失);
holder.ll.setVisibility(视图已消失);
}           
}
返回v;
}
@凌驾
公共布尔值isEnabled(整型位置){
如果(地点\详细信息.get(位置).petted==1){
返回false;
}否则{
返回true;
}
}
静态类视窗夹{
TextView场馆名称;
TextView场馆区;
TextView场馆当前位置;
框架布局;
按钮按钮;
图像视图img;
}

因为它的循环视图,所以getView中的第二个参数(视图v)已经保存了前一个列表项中的内容。因此,您需要清除该imageView,因为它不会立即更改(由于正在下载图像)

将您的代码更改为类似这样的代码应该会起作用

if (v == null) { 

...

}else{
    holder = (ViewHolder) v.getTag();
    holder.img.setImageResource(0);
    holder.img.setBackgroundDrawable(0);
}

这是因为它循环使用视图,所以getView中的第二个参数(视图v)已经保存了前一个列表项中的内容。因此,您需要清除该imageView,因为它不会立即更改(由于正在下载图像)

将您的代码更改为类似这样的代码应该会起作用

if (v == null) { 

...

}else{
    holder = (ViewHolder) v.getTag();
    holder.img.setImageResource(0);
    holder.img.setBackgroundDrawable(0);
}

我以前遇到过这个问题,我意识到: 第一: 1-通用映像加载程序库中存在的AsyncTask应具有映像将加载到的imageView的WeakReference的类

2-滚动并显示带有图像的行时,其AsyncTask仍在获取图像,您必须确保不会为同一图像启动其他AsyncTask

经过长时间的搜索,我找到了另一个类,您可以自定义它以满足您的需求

package com.nweave.utils;

import java.io.IOException;
import java.lang.ref.WeakReference;
import java.net.URI;
import java.net.URISyntaxException;
import java.security.KeyStore;

import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.PlainSocketFactory;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.ProgressBar;

import com.nweave.view.ProductArrayAdapter;

public class ImageDownloader {
    private ProductArrayAdapter productArrayAdapter;

    public ImageDownloader(ProductArrayAdapter productArrayAdapter) {
        this.productArrayAdapter = productArrayAdapter;
    }

    public void download(String name, String url, ImageView imageView,
            ProgressBar progressBar) {
        if (cancelPotentialDownload(url, imageView)) {
            BitmapDownloaderTask bitmapDownloaderTask = new BitmapDownloaderTask(
                    name, imageView, progressBar);
            DownloadedDrawable downloadedDrawable = new DownloadedDrawable(
                    bitmapDownloaderTask);
            imageView.setImageDrawable(downloadedDrawable);
            bitmapDownloaderTask.execute(url);
        }
    }

    private class BitmapDownloaderTask extends AsyncTask<String, Void, Bitmap> {
        String url;
        private final WeakReference<ImageView> imageViewReference;
        private final String productName;
        private final ProgressBar progressbar;

        public BitmapDownloaderTask(String name, ImageView imageView,
                ProgressBar progressBar) {
            imageViewReference = new WeakReference<ImageView>(imageView);
            productName = name;
            progressbar = progressBar;
        }

        @Override
        protected Bitmap doInBackground(String... params) {
            HttpResponse response = null;
            HttpClient httpsClient = getHttpsClient();
            HttpGet httpGet = new HttpGet();
            try {
                httpGet.setURI(new URI(params[0]));

                response = httpsClient.execute(httpGet);
                Bitmap currentBitMap = BitmapFactory.decodeStream(response
                        .getEntity().getContent());
                productArrayAdapter.cacheImages.saveImages(productName,
                        currentBitMap);
                return currentBitMap;
            } catch (URISyntaxException e) {
                Log.e(ImageDownloader.class.getSimpleName() + ":doInBackground",
                        e.getMessage());
            } catch (ClientProtocolException e) {
                Log.e(ImageDownloader.class.getSimpleName() + ":doInBackground",
                        e.getMessage());
            } catch (IOException e) {
                Log.e(ImageDownloader.class.getSimpleName() + ":doInBackground",
                        e.getMessage());
            }
            return null;
        }

        @Override
        protected void onPostExecute(Bitmap result) {
            if (isCancelled()) {
                result = null;
            }
            if (imageViewReference != null) {
                ImageView imageView = imageViewReference.get();
                BitmapDownloaderTask bitmapDownloaderTask = ImageDownloader
                        .getBitmapDownloaderTask(imageView);
                if (this == bitmapDownloaderTask) {
                    imageView.setImageBitmap(result);
                    imageView.setVisibility(View.VISIBLE);
                    progressbar.setVisibility(View.INVISIBLE);
                }
            }
        }
    }

    private static class DownloadedDrawable extends ColorDrawable {
        private final WeakReference<BitmapDownloaderTask> bitmapDownloaderTaskReference;

        public DownloadedDrawable(BitmapDownloaderTask bitmapDownloaderTask) {
            bitmapDownloaderTaskReference = new WeakReference<BitmapDownloaderTask>(
                    bitmapDownloaderTask);
        }

        public BitmapDownloaderTask getBitmapDownloaderTask() {
            return bitmapDownloaderTaskReference.get();
        }
    }

    private static boolean cancelPotentialDownload(String url,
            ImageView imageView) {
        BitmapDownloaderTask bitmapDownloaderTask = getBitmapDownloaderTask(imageView);
        if (bitmapDownloaderTask != null) {
            String bitmapUrl = bitmapDownloaderTask.url;
            if ((bitmapUrl == null) || (!bitmapUrl.equals(url))) {
                bitmapDownloaderTask.cancel(true);
            } else {
                return false;
            }
        }
        return true;
    }

    private static BitmapDownloaderTask getBitmapDownloaderTask(
            ImageView imageView) {
        if (imageView != null) {
            Drawable drawable = imageView.getDrawable();
            if (drawable instanceof DownloadedDrawable) {
                DownloadedDrawable downloadedDrawable = (DownloadedDrawable) drawable;
                return downloadedDrawable.getBitmapDownloaderTask();
            }
        }
        return null;
    }

    private static HttpClient getHttpsClient() {
        try {
            KeyStore trustStore = KeyStore.getInstance(KeyStore
                    .getDefaultType());
            trustStore.load(null, null);
            SSLSocketFactory sslSocketFactory = new MySSLSocketFactory(
                    trustStore);
            sslSocketFactory
                    .setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
            HttpParams params = new BasicHttpParams();
            HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
            HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);
            SchemeRegistry registry = new SchemeRegistry();
            registry.register(new Scheme("http", PlainSocketFactory
                    .getSocketFactory(), 80));
            registry.register(new Scheme("https", sslSocketFactory, 443));
            ClientConnectionManager ccm = new ThreadSafeClientConnManager(
                    params, registry);
            return new DefaultHttpClient(ccm, params);
        } catch (Exception e) {
            Log.e(ImageDownloader.class.getSimpleName() + ":getHttpsClient",
                    e.getMessage());
            return new DefaultHttpClient();
        }
    }
}
package com.nweave.utils;
导入java.io.IOException;
导入java.lang.ref.WeakReference;
导入java.net.URI;
导入java.net.URISyntaxException;
导入java.security.KeyStore;
导入org.apache.http.HttpResponse;
导入org.apache.http.HttpVersion;
导入org.apache.http.client.ClientProtocolException;
导入org.apache.http.client.HttpClient;
导入org.apache.http.client.methods.HttpGet;
导入org.apache.http.conn.ClientConnectionManager;
导入org.apache.http.conn.scheme.PlainSocketFactory;
导入org.apache.http.conn.scheme.scheme;
导入org.apache.http.conn.scheme.SchemeRegistry;
导入org.apache.http.conn.ssl。