android-ViewHolder ImageView随机加载

android-ViewHolder ImageView随机加载,android,json,listview,imageview,Android,Json,Listview,Imageview,我是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;

我是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);
            }
        }

    }

}
package com.dianagung.json;
导入java.io.InputStream;
导入java.util.ArrayList;
导入android.content.Context;
导入android.graphics.Bitmap;
导入android.graphics.BitmapFactory;
导入android.os.AsyncTask;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.ImageView;
导入android.widget.TextView;
公共类MoviesAdapter扩展了ArrayAdapter{
ArrayList ArrayListMovies;
智力资源;
语境;
拉平机vi;
视窗座;
公共MoviesAdapter(上下文、int资源、,
ArrayList对象){
超级(上下文、资源、对象);
ArrayListMovies=对象;
资源=资源;
this.context=上下文;
vi=(LayoutFlater)上下文
.getSystemService(上下文布局\充气机\服务);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图v=转换视图;
如果(v==null){
holder=新的ViewHolder();
v=vi.充气(资源,空);
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=(ViewHolder)v.getTag();
}
holder.mImage.setImageResource(R.drawable.ic_启动器);
新建下载映像(holder.mImage).execute(ArrayListMovies.get(position)
.getImage());
holder.mTitle.setText(ArrayListMovies.get(position.getTitle());
holder.mDate.setText(ArrayListMovies.get(position.getDate());
返回v;
}
静态类视窗夹{
公共图像视图;
公共文本视图mTitle;
公共文本视图mDate;
}
//下载图像任务
私有类DownloadImage扩展异步任务{
图像视图bmImage;
公共下载图像(ImageView bmImage){
this.bmImage=bmImage;
}
受保护位图doInBackground(字符串…URL){
字符串urldisplay=url[0];
位图mIcon=null;
试一试{
InputStream in=newjava.net.URL(urldisplay.openStream();
mIcon=BitmapFactory.decodeStream(in);
}捕获(例外e){
Log.e(“Error”,e.getMessage());
e、 printStackTrace();
}
返回mIcon;
}
受保护的void onPostExecute(位图结果){
如果(结果!=null){
位图bmp2=Bitmap.createScaledBitmap(结果,80,真);
bmImage.setImageBitmap(bmp2);
}
}
}
}

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

添加此行
holder.mImage.setImageBitmap(null)它会完成工作的


顺便说一句,您没有使用正确的方式解码位图,您可能会遇到
OutOfMemory异常
如果有大量位图,您可能会使用asyn图像加载。

您的ImageView加载随机图像的原因是,当您的用户滚动列表时,并非所有图像都已加载完毕,您正在循环视图。这意味着您正在执行的任务附加到不再显示相同图像的ImageView。您需要确保在用户滚动时取消任务,以便任务不会完成,甚至不会执行,除非仍然需要它们。您可以在此处看到这样一个示例: