2013-08-07 5 views
3

В моем приложении для Android я загружаю изображения из API. но после того, как изображения загружены в представление сетки, прокрутка не является гладкой. Я использую асинхронные потоки для извлечения изображений, чтобы он не блокировал пользовательский интерфейс.Прокрутка негладкая в андроиде Grid View

Любые предложения теперь улучшить производительность прокрутки.

+0

Повторное использование ваших просмотров и использование шаблона ViewHolder? –

+1

Можете ли вы добавить код для вашего адаптера (в частности, метод getView()) – Selecsosi

+0

У меня тоже была эта проблема, и я уменьшил размер моих изображений и отлично работал –

ответ

2

Загрузка изображений в отдельную строку определенно помогает, однако есть еще одна важная проблема с производительностью, которую нужно позаботиться здесь, и это «повторное использование просмотров», как только вы установили изображение в своем адаптере, убедитесь, что вы на самом деле повторно используете представления, представленные в методе getView адаптера, и не создавая/раздувая новый макет (GridElement) каждый раз при вызове этого метода, обычно это приводит к замедлению прокрутки после загрузки всех изображений, доступно несколько шаблонов подойти к этому вопросу, вы должны прочитать о ViewHolder, является наиболее распространенными и простым в использовании шаблона для этого вопроса ...

Надеются, что это помогает ...

С уважением

+0

Теперь прокрутка прекрасна, но изображение меняет позиции на прокрутка вниз. Я передаю объект imageView для установки изображения после его загрузки. Я использовал ViewHolder для сохранения ImageView, но проблема все еще сохраняется. –

0

Код для GetView() метод {{{

@Override 
     public View getView(final int position, View convertView, ViewGroup parent) { 
       final HashMap<String, String> song = songsList.get(position); 
       imageURL = song.get(VariablesList.TAG_ALBUM_IMAGE); 
       View v = null; 
       if (convertView != null) 
         v = convertView; 
       else 
         v = inflater.inflate(R.layout.gridlayout_item, parent, false); 
       final ImageView imageView = (ImageView) v.findViewById(R.id.icon_image); 
       final Thread startAlbum = new Thread() { 
         public void run() { 

           imageView.setImageBitmap(AlbumList 
               .LoadImagetoGridView(imageURL)); 

           synchronized (this) { 
             this.notifyAll(); 
           } 
         } 
       }; 

       synchronized (startAlbum) { 
         startAlbum.start(); 
         try { 
           startAlbum.wait(); 
         } catch (InterruptedException e) { 
           e.printStackTrace(); 
         } 
       } 
       imageView.setOnClickListener(new View.OnClickListener() { 
         // @Override 
         public void onClick(View v) { 
           albumUrl = new StringBuffer(resources.getString(R.string.songsListURL)); 
           String albumIndex = song.get("id"); 
           albumName = (song.get("name")); 
           imageURL = song.get(VariablesList.TAG_ALBUM_IMAGE); 
           SongsList albumList = new SongsList(imageURL, albumUrl, 
               albumName,albumIndex,resources); 
           Thread threadAlbumList = new Thread(albumList); 
           threadAlbumList.start(); 

           synchronized (albumList) { 
             try { 
               albumList.wait(); 
             } catch (InterruptedException e) { 
               e.printStackTrace(); 
             } 
           } 
           if (!NewMediaPlayer.mediaPlayer.isPlaying()) { 
             HashMap<String, String> playingSong = NewMediaPlayer.selectedSongs 
                 .get(0); 
             if (playingSong != null) { 
               String url = playingSong.get("songUrl"); 
               String songName = playingSong.get("songName"); 
               if (songName != null) 
                 { 
                 NewMediaPlayer.songTitleLabel.setText(albumName 
                     + " - " + songName); 
                 NewMediaPlayer.songTitle.setText(albumName+"-"+songName); 
                 } 
               NewMediaPlayer.playSong(url); 
             } 
           } 
         } 
       }); 

       TextView itemAlbumName = (TextView) v.findViewById(R.id.icon_text); 
       itemAlbumName.setText(song.get("name")); 
       itemAlbumName.setOnClickListener(new View.OnClickListener() { 
         public void onClick(View v) { 
           HashMap<String, String> song = songsList.get(position); 
           String songIndex = song.get("id"); 
           String albumName = (song.get("name")); 
           Intent in = new Intent(context, SongListActivity.class); 
           in.putExtra("albumIndex", songIndex); 
           in.putExtra("albumName", albumName); 
           in.putExtra("AlbumImage", song.get(VariablesList.TAG_ALBUM_IMAGE)); 
           context.startActivity(in); 
         } 
       }); 

       return v; 
     } 

}}} 
+0

Какой смысл делать setImageBitmap в отдельном потоке, когда вы вынуждаете основной поток пользовательского интерфейса ждать, так или иначе? –

+0

как загрузить изображение растрового изображения в пользовательском интерфейсе? –

+0

Чтобы сделать это только на отдельном потоке, это в значительной степени то, что вы делаете, но не призывая ждать, потому что это практически загружает его в основной поток, так как вы ожидаете его загрузки в любом случае, лучший способ - запустить поток самостоятельно, и однажды сделанный, ТОГДА вы установили изображение, НО вы должны сделать это с помощью обработчика, так как для изменения представлений вам нужен код для выполнения в основном потоке. Теперь, если вы загружаете imgs из URL-адреса, посмотрите на проект волейбола, у него есть механизм кеширования изображений, который отлично работает, поэтому, если изображение уже загружено, оно просто извлекается из кеша ... –

0

Вместо того, чтобы усилия, использовать универсальный погрузчик Image library.And его производительность хорошо. В методе onCreate gridView.setAdapter (новый ImageAdapter (это, ImagesArrayPath));

private static class ImageAdapter extends BaseAdapter { 
    private final String[] IMAGE_URLS ; 

    private LayoutInflater inflater; 

    private DisplayImageOptions options; 

    ImageAdapter(Context context,String source[]) { 
     inflater = LayoutInflater.from(context); 
     IMAGE_URLS=source; 

     options = new DisplayImageOptions.Builder() 
       .showImageOnLoading(R.mipmap.ico_place_holder) 
       .showImageForEmptyUri(R.drawable.ic_empty) 
       .showImageOnFail(R.drawable.ic_error) 
       .cacheInMemory(true) 
       .cacheOnDisk(true) 
       .considerExifParams(true) 
       .bitmapConfig(Bitmap.Config.RGB_565) 
       .build(); 
    } 



    @Override 
    public int getCount() { 
     return IMAGE_URLS.length; 
    } 

    @Override 
    public Object getItem(int position) { 
     return null; 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     final ViewHolder holder; 
     View view = convertView; 
     if (view == null) { 
      view = inflater.inflate(R.layout.item_grid_image, parent, false); 
      holder = new ViewHolder(); 
      assert view != null; 
      holder.imageView = (ImageView) view.findViewById(R.id.image); 
      holder.progressBar = (ProgressBar) view.findViewById(R.id.progress); 
      view.setTag(holder); 
     } else { 
      holder = (ViewHolder) view.getTag(); 
     } 

     ImageLoader.getInstance() 
       .displayImage(IMAGE_URLS[position], holder.imageView, options, new SimpleImageLoadingListener() { 
        @Override 
        public void onLoadingStarted(String imageUri, View view) { 
         holder.progressBar.setProgress(0); 
         holder.progressBar.setVisibility(View.VISIBLE); 
        } 

        @Override 
        public void onLoadingFailed(String imageUri, View view, FailReason failReason) { 
         holder.progressBar.setVisibility(View.GONE); 
        } 

        @Override 
        public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 
         holder.progressBar.setVisibility(View.GONE); 
        } 
       }, new ImageLoadingProgressListener() { 
        @Override 
        public void onProgressUpdate(String imageUri, View view, int current, int total) { 
         holder.progressBar.setProgress(Math.round(100.0f * current/total)); 
        } 
       }); 

     return view; 
    } 
} 

static class ViewHolder { 
    ImageView imageView; 
    ProgressBar progressBar; 
} 

Это поможет вам. Наслаждайтесь кодированием.

Смежные вопросы