Android Listview从url加载imageview

时间:2016-03-25 15:33:34

标签: android listview

我正在从网址加载图片并将其输入到我的列表视图中。问题是每当我滚动列表视图时,imageview正在改变它的图像。

我使用以下代码:How to load an ImageView by URL in Android?从网址加载图片:

public class ImageLoadTask extends AsyncTask<Void, Void, Bitmap> {

    private String url;
    private ImageView imageView;

    public ImageLoadTask(String url, ImageView imageView) {
        this.url = url;
        this.imageView = imageView;
    }

    @Override
    protected Bitmap doInBackground(Void... params) {
        try {
            URL urlConnection = new URL(url);
            HttpURLConnection connection = (HttpURLConnection) urlConnection
                    .openConnection();
            connection.setDoInput(true);
            connection.connect();
            InputStream input = connection.getInputStream();
            Bitmap myBitmap = BitmapFactory.decodeStream(input);
            return myBitmap;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Bitmap result) {
        super.onPostExecute(result);
        imageView.setImageBitmap(result);
    }

}

在我的ListAdapter中,我使用此代码加载图像:

public View getView(int position, View convertView, ViewGroup parent){
    ViewHolderItem holder = new ViewHolderItem();
    if (convertView == null) {
     LayoutInflater inflater = (LayoutInflater) main.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(R.layout.cell, null);

        holder.name = (TextView) convertView.findViewById(R.id.name);
        holder.thumb = (ImageView) convertView.findViewById(R.id.thumb);
        holder.duration = (TextView) convertView.findViewById(R.id.duration);
        //holder.code = (TextView) convertView.findViewById(R.id.code);
        convertView.setTag(holder);
    }
    else{
         holder = (ViewHolderItem) convertView.getTag();
    }


    holder.name.setText(this.main.countries.get(position).title);
    if (holder.thumb != null) {
        new DownloadImageTask(holder.thumb).execute(this.main.countries.get(position).thumb);
    }
    return convertView;
}

在我的主要活动中:

   public void get_data(String data){
        try {
            JSONArray data_array=new JSONArray(data);
            for (int i = 0 ; i < data_array.length() ; i++){
                JSONObject obj=new JSONObject(data_array.get(i).toString());

                Countries add=new Countries();
                add.title = obj.getString("title");
                add.thumb = obj.getString("artwork_url");

                countries.add(add);
            }

            adapter.notifyDataSetChanged();

        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

4 个答案:

答案 0 :(得分:5)

尝试使用Picasso library。使用起来非常简单,例如

Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);

Picasso具有自动内存和磁盘缓存功能。这在ListView中非常重要。

  

我在哪里可以获得变量名context

获取上下文:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    Context context = parent.getContext();
    [...]
}

答案 1 :(得分:1)

您应该使用像Picasso这样的图片加载库。它使得从URL加载图像非常简单,并且也可以进行缓存。

答案 2 :(得分:1)

我同意现有的两个答案,避免任何麻烦并让您的生活更轻松的最佳方法是使用当前可用的图像库之一:PicassoGlide

与Picasso相比,Glide同样易于使用。我看过一个视频,在使用列表视图时,与Glide相比,在Picasso上加载图像所需的时间更长,但这可能取决于配置设置。 Glide还可以使用对您来说可能重要但可能不重要的GIF。

以下是使用Glide的示例:

ImageView imageView = (ImageView) findViewById(R.id.my_image_view);

Glide.with(this).load("https://lh6.ggpht.com/9SZhHdv4URtBzRmXpnWxZcYhkgTQurFuuQ8OR7WZ3R7fyTmha77dYkVvcuqMu3DLvMQ=w300").into(imageView);

希望这有帮助!

答案 3 :(得分:1)

您需要为ListView尝试图片下载和缓存库。这可以使性能更快,并将图像轻松加载到ImageView

PicassoGlide是将ImageView中的图片加载到ListView

的最佳示例