Android 自定义阵列适配器仅在快速滚动时显示重复项

Android 自定义阵列适配器仅在快速滚动时显示重复项,android,android-listview,android-asynctask,android-arrayadapter,Android,Android Listview,Android Asynctask,Android Arrayadapter,我的listview工作得差不多很好。当我快速向上或向下滚动时,每次都会显示相同的3-4张图片,慢慢变成右图 用于检索我认为需要修复的位图的代码 public Bitmap retrieveBitmap(String url) throws Exception { InputStream inputStream = null; try { inputStream = this.retrieveStream(url);

我的listview工作得差不多很好。当我快速向上或向下滚动时,每次都会显示相同的3-4张图片,慢慢变成右图

用于检索我认为需要修复的位图的代码

public Bitmap retrieveBitmap(String url) throws Exception {
        InputStream inputStream = null;
        try {
            inputStream = this.retrieveStream(url);
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inSampleSize = 8;
            final Bitmap bitmap = BitmapFactory.decodeStream(inputStream, null, options);
            return bitmap;
        } finally {
            try {
                if (inputStream != null) {
                    inputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
在我添加选项示例大小之前,它在我滚动时不断崩溃,我只是从另一个堆栈问题中复制了这个问题,但不确定它除了以某种方式减小大小之外,还做了什么

适配器类

package com.example.jdmb;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
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> {
    private ArrayList<Movies> movieData;
    private Activity context;

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = convertView;
        ViewHolder holder;
        if (view == null) {
            LayoutInflater vi = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = vi.inflate(R.layout.list_row, parent, false);
            holder = new ViewHolder();
            holder.id = (TextView) view.findViewById(R.id.movieId);
            holder.title = (TextView) view.findViewById(R.id.movieTitle);
            holder.vote_avg = (TextView) view.findViewById(R.id.movieAvg);
            holder.backdrop_path = (ImageView) view
                    .findViewById(R.id.movieBackdrop);
            holder.release_date = (TextView) view
                    .findViewById(R.id.movieRelease);
            holder.original_title = (TextView) view
                    .findViewById(R.id.movieTitle2);
            holder.vote_count = (TextView) view.findViewById(R.id.movieCount);
            holder.adult = (TextView) view.findViewById(R.id.movieAdult);
            holder.poster = (ImageView) view.findViewById(R.id.moviePoster);
            holder.popularity = (TextView) view
                    .findViewById(R.id.moviePopularity);
            view.setTag(holder);

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

        }
        Movies movie = movieData.get(position);

        if (movie != null) {
            // check to see if each individual textview is null.
            // if not, assign some text!

            holder.id.setText("id: " + movie.getId());
            holder.title.setText("title: " + movie.getTitle());
            holder.vote_avg.setText("vote_avg: " + movie.getVote_average());
            DownloadBitmap.downloadBitmap(holder.backdrop_path,
                    movie.getBackdrop_path());
            holder.release_date.setText("release_date: "
                    + movie.getRelease_date());
            holder.original_title.setText("original_title: "
                    + movie.getOriginal_title());
            holder.vote_count.setText("vote_count: " + movie.getVote_count());
            holder.adult.setText("adult: " + movie.isAdult());
            DownloadBitmap
                    .downloadBitmap(holder.poster, movie.getPoster_path());
            holder.popularity.setText("popularity: " + movie.getPopularity());

        }
        return view;

    }

    private static class ViewHolder {
        TextView id;
        TextView title;
        TextView vote_avg;
        ImageView backdrop_path;
        TextView release_date;
        TextView original_title;
        TextView vote_count;
        TextView adult;
        ImageView poster;
        TextView popularity;
    }
}
package com.example.jdmb;
导入java.util.ArrayList;
导入android.app.Activity;
导入android.content.Context;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.ImageView;
导入android.widget.TextView;
公共类MoviesAdapter扩展了ArrayAdapter{
私有ArrayList电影数据;
私人活动语境;
公共MoviesAdapter(上下文、int资源、,
ArrayList对象){
超级(上下文、资源、对象);
this.context=(活动)上下文;
this.movieData=对象;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图=转换视图;
视窗座;
如果(视图==null){
LayoutInflater vi=(LayoutInflater)上下文
.getSystemService(上下文布局\充气机\服务);
视图=vi.充气(R.layout.list_行,父级,false);
holder=新的ViewHolder();
holder.id=(TextView)view.findViewById(R.id.movieId);
holder.title=(TextView)view.findViewById(R.id.movieTitle);
holder.vote_avg=(TextView)view.findViewById(R.id.movieAvg);
holder.u路径=(图像视图)视图
.findviewbyd(R.id.moviebackground);
holder.release_date=(TextView)视图
.findviewbyd(R.id.movieRelease);
holder.original_title=(TextView)视图
.findviewbyd(R.id.movieTitle2);
holder.vote_count=(TextView)view.findViewById(R.id.movieCount);
holder.成人=(TextView)view.findViewById(R.id.movie成人);
holder.poster=(ImageView)view.findViewById(R.id.moviePoster);
holder.popularity=(TextView)视图
.findviewbyd(R.id.moviePopularity);
视图.设置标签(支架);
}否则{
holder=(ViewHolder)view.getTag();
}
Movies movie=movieData.get(位置);
如果(电影!=null){
//检查每个文本视图是否为空。
//如果没有,请指定一些文本!
holder.id.setText(“id:+movie.getId());
holder.title.setText(“title:+movie.getTitle());
holder.vote_avg.setText(“vote_avg:+movie.getVote_average());
下载位图。下载位图(holder.u路径,
movie.getbackground_path());
holder.release\u date.setText(“release\u date:
+movie.getRelease_date());
holder.original_title.setText(“original_title:
+movie.getOriginal_title());
holder.vote\u count.setText(“vote\u count:+movie.getVote\u count());
holder.成人.setText(“成人:+movie.isAdult());
下载位图
.downloadBitmap(holder.poster,movie.getPoster_path());
holder.popularity.setText(“popularity:+movie.getPopularity());
}
返回视图;
}
私有静态类视图持有者{
文本视图id;
文本视图标题;
文本视图平均投票;
ImageView-u路径;
文本视图发布日期;
文本查看原始标题;
TextView投票计数;
文本视图成人;
ImageView海报;
文本视图流行度;
}
}
下载类

package com.example.jdmb;

import java.io.InputStream;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.os.AsyncTask;
import android.widget.ImageView;

public class DownloadBitmap {
    static Bitmap image;

    public static void downloadBitmap(final ImageView imageView,
            final String url) {

        new AsyncTask<Bitmap, Void, Bitmap>() {

            @Override
            protected Bitmap doInBackground(Bitmap... params) {
                HttpRetriever retriever = new HttpRetriever();
                try {                   
                    image = retriever.retrieveBitmap(url);
                } catch (Exception e) {
                }
                return image;

            }

            @Override
            protected void onPostExecute(Bitmap result) {
                super.onPostExecute(result);
                if (imageView != null) {

                    imageView.setImageBitmap(result);
                }
            }

        }.execute();

    }
}
package com.example.jdmb;
导入java.io.InputStream;
导入android.graphics.Bitmap;
导入android.graphics.BitmapFactory;
导入android.graphics.BitmapFactory.Options;
导入android.os.AsyncTask;
导入android.widget.ImageView;
公共类下载位图{
静态位图图像;
公共静态无效下载位图(最终图像视图图像视图,
最终字符串(url){
新建异步任务(){
@凌驾
受保护位图doInBackground(位图…参数){
HttpRetriever retriever=新的HttpRetriever();
试试{
image=retriever.retrieveBitmap(url);
}捕获(例外e){
}
返回图像;
}
@凌驾
受保护的void onPostExecute(位图结果){
super.onPostExecute(结果);
如果(imageView!=null){
设置图像位图(结果);
}
}
}.execute();
}
}

我的代码的哪一部分使我在滚动时看到相同的照片,我认为这与回收图像有关,但不确定如何通过它。

回收的图像视图显示了您告诉它的最后一个位图。您需要在返回视图之前或在执行异步任务时,将holder.background\u path&holder.poster设置为通用资源

像这样:

package com.example.jdmb;

import java.io.InputStream;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.widget.ImageView;

public class DownloadBitmap {
    static Bitmap image;

    public static void downloadBitmap(final ImageView imageView,
            final String url) {

        new AsyncTask<Bitmap, Void, Bitmap>() {

            protected void onPreExecute(){
                //This could also be an internal resource instead of null
                imageView.setImageBitmap(null);
            }

            @Override
            protected Bitmap doInBackground(Bitmap... params) {
                HttpRetriever retriever = new HttpRetriever();
                InputStream is = retriever.retrieveStream(url);
                image = BitmapFactory.decodeStream(is);
                return image;

            }

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

            }

        }.execute();

    }
}
调整电影适配器构造函数

package com.example.jdmb;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
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> {
    private ArrayList<Movies> movieData;
    private Activity context;
    private ImageLoader mImageLoader;

    public MoviesAdapter(Context context, int resource,
            ArrayList<Movies> objects, ImageLoader loader) {
        super(context, resource, objects);
        this.context = (Activity) context;
        this.movieData = objects;
        this.mImageLoader = loader;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = convertView;
        ViewHolder holder;
        if (view == null) {
            LayoutInflater vi = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = vi.inflate(R.layout.list_row, parent, false);
            holder = new ViewHolder();
            holder.id = (TextView) view.findViewById(R.id.movieId);
            holder.title = (TextView) view.findViewById(R.id.movieTitle);
            holder.vote_avg = (TextView) view.findViewById(R.id.movieAvg);
            holder.backdrop_path = (ImageView) view
                    .findViewById(R.id.movieBackdrop);
            holder.release_date = (TextView) view
                    .findViewById(R.id.movieRelease);
            holder.original_title = (TextView) view
                    .findViewById(R.id.movieTitle2);
            holder.vote_count = (TextView) view.findViewById(R.id.movieCount);
            holder.adult = (TextView) view.findViewById(R.id.movieAdult);
            holder.poster = (ImageView) view.findViewById(R.id.moviePoster);
            holder.popularity = (TextView) view
                    .findViewById(R.id.moviePopularity);
            view.setTag(holder);

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

        }
        Movies movie = movieData.get(position);

        if (movie != null) {
            // check to see if each individual textview is null.
            // if not, assign some text!

            holder.id.setText("id: " + movie.getId());
            holder.title.setText("title: " + movie.getTitle());
            holder.vote_avg.setText("vote_avg: " + movie.getVote_average());
            mImageLoader.get(movie.getBackdrop_path(), holder.backdrop_path);
            holder.release_date.setText("release_date: "
                    + movie.getRelease_date());
            holder.original_title.setText("original_title: "
                    + movie.getOriginal_title());
            holder.vote_count.setText("vote_count: " + movie.getVote_count());
            holder.adult.setText("adult: " + movie.isAdult());
            mImageLoader.get(movie.getPoster_path(), holder.poster);
            holder.popularity.setText("popularity: " + movie.getPopularity());
        }
        return view;
    }

    private static class ViewHolder {
        TextView id;
        TextView title;
        TextView vote_avg;
        ImageView backdrop_path;
        TextView release_date;
        TextView original_title;
        TextView vote_count;
        TextView adult;
        ImageView poster;
        TextView popularity;
    }
}
package com.example.jdmb;
导入java.util.ArrayList;
导入android.app.Activity;
导入android.content.Context;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.ImageView;
导入android.widget.TextView;
公共类MoviesAdapter扩展了ArrayAdapter{
私有ArrayList电影数据;
私人活动语境;
私有图像加载器;
公共MoviesAdapter(上下文、int资源、,
@Override
public void onCreate(Bundle savedInstanceState){
...
ImageLoader mImageLoader = new ImageLoader(this, R.drawable.default_image);
MoviesAdapter  mMoviesAdapter = new MoviesAdapter(this, R.layout.your_list_layout, moviesList, mImageLoader);
...
}
package com.example.jdmb;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
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> {
    private ArrayList<Movies> movieData;
    private Activity context;
    private ImageLoader mImageLoader;

    public MoviesAdapter(Context context, int resource,
            ArrayList<Movies> objects, ImageLoader loader) {
        super(context, resource, objects);
        this.context = (Activity) context;
        this.movieData = objects;
        this.mImageLoader = loader;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = convertView;
        ViewHolder holder;
        if (view == null) {
            LayoutInflater vi = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            view = vi.inflate(R.layout.list_row, parent, false);
            holder = new ViewHolder();
            holder.id = (TextView) view.findViewById(R.id.movieId);
            holder.title = (TextView) view.findViewById(R.id.movieTitle);
            holder.vote_avg = (TextView) view.findViewById(R.id.movieAvg);
            holder.backdrop_path = (ImageView) view
                    .findViewById(R.id.movieBackdrop);
            holder.release_date = (TextView) view
                    .findViewById(R.id.movieRelease);
            holder.original_title = (TextView) view
                    .findViewById(R.id.movieTitle2);
            holder.vote_count = (TextView) view.findViewById(R.id.movieCount);
            holder.adult = (TextView) view.findViewById(R.id.movieAdult);
            holder.poster = (ImageView) view.findViewById(R.id.moviePoster);
            holder.popularity = (TextView) view
                    .findViewById(R.id.moviePopularity);
            view.setTag(holder);

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

        }
        Movies movie = movieData.get(position);

        if (movie != null) {
            // check to see if each individual textview is null.
            // if not, assign some text!

            holder.id.setText("id: " + movie.getId());
            holder.title.setText("title: " + movie.getTitle());
            holder.vote_avg.setText("vote_avg: " + movie.getVote_average());
            mImageLoader.get(movie.getBackdrop_path(), holder.backdrop_path);
            holder.release_date.setText("release_date: "
                    + movie.getRelease_date());
            holder.original_title.setText("original_title: "
                    + movie.getOriginal_title());
            holder.vote_count.setText("vote_count: " + movie.getVote_count());
            holder.adult.setText("adult: " + movie.isAdult());
            mImageLoader.get(movie.getPoster_path(), holder.poster);
            holder.popularity.setText("popularity: " + movie.getPopularity());
        }
        return view;
    }

    private static class ViewHolder {
        TextView id;
        TextView title;
        TextView vote_avg;
        ImageView backdrop_path;
        TextView release_date;
        TextView original_title;
        TextView vote_count;
        TextView adult;
        ImageView poster;
        TextView popularity;
    }
}