2015-05-19 2 views
2

Я пытаюсь загрузить изображения в виде списка из URL. Когда я прокручиваю или пока список заселение изображения мерцать и не на правом ряду ..Мерцающие изображения в ListView

вот мой адаптер код:

public class RecipesAdapter extends ArrayAdapter<XmlDataCollected> { 
    // View lookup cache 
    private static class ViewHolder { 
     static ImageView img; 
     TextView name; 
     TextView info; 
     ImageDownloader controller; 
    } 

    public RecipesAdapter(Context context, List<XmlDataCollected> recipes) { 
     super(context, R.layout.fragment_search_result, recipes); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // Get the data item for this position 
     XmlDataCollected recipe = getItem(position); 
     // Check if an existing view is being reused, otherwise inflate the view 
     ViewHolder viewHolder; // view lookup cache stored in tag 
     if (convertView == null) { 
      viewHolder = new ViewHolder(); 
      LayoutInflater inflater = LayoutInflater.from(getContext()); 
      convertView = inflater.inflate(R.layout.fragment_search_result, parent, false); 
      viewHolder.name = (TextView) convertView.findViewById(R.id.label); 
      viewHolder.info = (TextView) convertView.findViewById(R.id.info); 
      ViewHolder.img = (ImageView) convertView.findViewById(R.id.icon); 
      convertView.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
      viewHolder.img.setImageBitmap(null); 
     } 

     if (viewHolder.controller != null) { 
      viewHolder.controller.cancel(false); 
     } 

     viewHolder.controller = new ImageDownloader(viewHolder.img); 

     if (viewHolder.controller != null) { 
      viewHolder.controller.execute(recipe.getImgUrl()); 
     } 

     // Populate the data into the template view using the data object 
     viewHolder.name.setText(recipe.getRecipeName()); 
     if(recipe.getType() != null) { 
      viewHolder.info.setText(recipe.getType()); 
     } 
     else { 
      viewHolder.info.setText("Unknown category"); 
     } 

     //new ImageDownloader(viewHolder.img).execute(recipe.getImgUrl()); 
     // Return the completed view to render on screen 
     return convertView; 
    } 

    public class ImageDownloader extends AsyncTask<String, Void, Bitmap> { 
     ImageView bmImage; 

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

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

     } 

     protected void onPostExecute(Bitmap result) { 
      if(result != null) { 
       bmImage.setImageBitmap(result); 
      } 
      else{ 
       bmImage.setImageResource(R.drawable.ic_launcher); 
      } 
     } 
    } 
} 
+0

Есть несколько библиотек, чтобы загрузить кэш изображений с URL, как https://github.com/mcxiaoke/android-volley или http://square.github.io/picasso/. Это поможет вам писать меньше кода и работать намного лучше. Но я думаю, что вам все равно нужно отслеживать запросы и прекращать загрузку изображений для строк, которые не отображаются. – torque203

ответ

0

в вашем Listview XML
добавить

android:cacheColorHint="#00000000" 

или код

listView.setCacheColorHint(Color.TRANSPARENT); 

, а также УДАЛЫ е

viewHolder.img.setImageBitmap(null); 

из вашего else состояния

1

я тоже была эта проблема. В вашем GetView() метод добавить следующий код:

if (viewHolder.controller != null) { 
    viewHolder.controller.cancel(false); 
} 

viewHolder.controller = new ImageDownloader(viewHolder.img); 

if (viewHolder.controller != null) { 
    viewHolder.controller.execute(recipe.getImgUrl()); 
} 
+0

Как использовать этот контроллер? он говорит: «Невозможно разрешить контроллер символов» –

+0

Вы должны добавить 'ImageLoader controller;' в свой статический класс ViewHolder. – PatrickMA

+0

Проблема остается, когда я прокручиваю фотографии, продолжаю танцевать –

0

Другое то выше предложения, у меня есть другие предложения, а также, которые могли бы помочь.

Вы должны сделать ваш метод getView() более оптимизированным, так как он получает вызов для каждой строки, которая входит в видимую область. Изменение условий if/else для вызовов методов также может помочь.

Прежде всего я рекомендую вам посмотреть на этом сайте:

http://leftshift.io/6-ways-to-make-your-lists-scroll-faster-than-the-wind

Изменение высоты в ListView, чтобы он соответствовал родителю от содержания оберточной также имеет огромное значение для оптимизации, если вы используете wrap_content. Вы также можете попробовать сделать его 0dp. Он создает тот же результат.

Проверьте эту тему для оптимизации «match_parent», если вам нужна дополнительная информация.

Why is 0dp considered a performance enhancement?

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