Images are repeating in ListView

后端 未结 6 1634
遥遥无期
遥遥无期 2020-12-15 12:49

I have implemented android app which should download images from server and display them in ListView, but very interesting thing occures while images are downloading

6条回答
  •  谎友^
    谎友^ (楼主)
    2020-12-15 12:53

    Views are reused for performance with Adapters. You should use another approch . You have to have a class holder which reuse your views. In your case you class should be something like this:

       public class MoviesAdapter extends ArrayAdapter {
        private ArrayList movieDataItems;   
        private Activity context;
    
        public MoviesAdapter(Activity context, int textViewResourceId,       ArrayList movieDataItems) {
            super(context, textViewResourceId, movieDataItems);
            this.context = context;
            this.movieDataItems = movieDataItems;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) { 
            if (convertView == null) {
                LayoutInflater vi = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = vi.inflate(R.layout.movie_data_row, null);
    
                    holder = new ViewHolder();
    
                    holder.imageView = (BarImageView) convertView.findViewById(R.id.movie_thumb_icon);
                  } else {
                            holder = (ViewHolder) convertView.getTag();
    
                      }
    
            ParkCinema movie = movieDataItems.get(position);
    
            if (movie!=null){
    
                        String url = movie.poster();
    
                         if (url!=null) {
                            Bitmap bitmap = fetchBitmapFromCache(url);
                            if (bitmap==null) { 
                                new BitmapDownloaderTask(imageView).execute(url);
                            }
                            else {
                                imageView.setImageBitmap(bitmap);
                            } 
                        } 
            }
            return convertView;
        }
    
        private LinkedHashMap bitmapCache = new LinkedHashMap();
    
        private void addBitmapToCache(String url, Bitmap bitmap) {
            if (bitmap != null) {
                synchronized (bitmapCache) {
                    bitmapCache.put(url, bitmap);
                }
            }
        }
    
        private Bitmap fetchBitmapFromCache(String url) {
    
            synchronized (bitmapCache) {
                final Bitmap bitmap = bitmapCache.get(url);
                 if (bitmap != null) {
                    return bitmap;
                } 
            }
    
            return null;
    
    
    public static class ViewHolder {
    
    
            ImageView imageView; 
    
    
        }
    
        }
    

提交回复
热议问题