【问题标题】:android - ViewHolder ImageView Load Randomlyandroid - ViewHolder ImageView 随机加载
【发布时间】:2014-08-31 09:49:06
【问题描述】:

我是 Android 开发的初学者。我尝试使用 JSON 创建 ListView。我对随机加载的 ImageView 有疑问。这是我的 MoviesAdapter.java:

    package com.dianagung.json;

    import java.io.InputStream;
    import java.util.ArrayList;

    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.os.AsyncTask;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;

public class MoviesAdapter extends ArrayAdapter<Movies> {

    ArrayList<Movies> ArrayListMovies;
    int Resource;
    Context context;
    LayoutInflater vi;
    ViewHolder holder;


    public MoviesAdapter(Context context, int resource,
            ArrayList<Movies> objects) {
        super(context, resource, objects);
        ArrayListMovies = objects;
        Resource = resource;
        this.context = context;

        vi = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View v = convertView;
        if (v == null) {
            holder = new ViewHolder();

            v = vi.inflate(Resource, null);
            holder.mImage = (ImageView) v.findViewById(R.id.mImage);
            holder.mTitle = (TextView) v.findViewById(R.id.mTitle);
            holder.mDate = (TextView) v.findViewById(R.id.mDate);
            v.setTag(holder);
        } else {
            holder = (ViewHolder) v.getTag();
        }

        holder.mImage.setImageResource(R.drawable.ic_launcher);
        new DownloadImage(holder.mImage).execute(ArrayListMovies.get(position)
                .getImage());
        holder.mTitle.setText(ArrayListMovies.get(position).getTitle());
        holder.mDate.setText(ArrayListMovies.get(position).getDate());
        return v;
    }

    static class ViewHolder  {
        public ImageView mImage;
        public TextView mTitle;
        public TextView mDate;
    }

    // Download Image Task
    private class DownloadImage extends AsyncTask<String, Void, Bitmap> {
        ImageView bmImage;

        public DownloadImage(ImageView bmImage) {
            this.bmImage = bmImage;
        }

        protected Bitmap doInBackground(String... urls) {
            String urldisplay = urls[0];
            Bitmap mIcon = null;
            try {
                InputStream in = new java.net.URL(urldisplay).openStream();
                mIcon = BitmapFactory.decodeStream(in);
            } catch (Exception e) {
                Log.e("Error", e.getMessage());
                e.printStackTrace();
            }
            return mIcon;
        }

        protected void onPostExecute(Bitmap result) {
            if (result != null) {
                Bitmap bmp2 = Bitmap.createScaledBitmap(result, 80, 80, true);
                bmImage.setImageBitmap(bmp2);
            }
        }

    }

}

任何帮助将不胜感激。提前致谢。

【问题讨论】:

  • 您的 ImageViews 加载随机图像的原因是,当您的用户滚动列表时,并非所有图像都已完成加载并且您正在回收视图。这意味着您执行的任务附加到不再显示相同图像的 ImageView。您需要确保在用户滚动时取消任务,以便任务不会完成甚至执行,除非仍然需要它们。你可以在这里看到一个例子:stackoverflow.com/questions/12414648/…

标签: android json listview imageview


【解决方案1】:

在调用 new DownloadImage(holder.mImage).execute(ArrayListMovies.get(position) .getImage()); 之前添加此行 holder.mImage.setImageBitmap(null); 即可。

顺便说一句,如果您没有使用正确的方式来解码位图,您可能会遇到OutOfMemory Exceptions 如果有大量位图,您可以使用NOSTRA13's library 进行异步图像加载。

【讨论】:

    猜你喜欢
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多