ListView est très lent – l'Android

Je souhaite afficher des images à partir du répertoire de ressources (toutes enregistrées en format png) dans mon ListView , mais il est extrêmement lègue. Je suis un noob complet, donc j'ai besoin d'aide pour les tâches asynchrones pour supprimer les décalages.

Adaptateur de liste:

  public class MyListAdapter extends ArrayAdapter < SettingsItem > { Context context; List < SettingsItem > items; public MyListAdapter(Context context, int resource, List < SettingsItem > objects) { super(context, resource, objects); this.context = context; items = objects; } @Override public View getView(int position, View itemView, ViewGroup parent) { ViewHolder holder; if (itemView == null) { LayoutInflater inflater = ((Activity) context).getLayoutInflater(); itemView = inflater.inflate(R.layout.settings_items, parent, false); holder = new ViewHolder(); holder.imageView = (ImageView) itemView.findViewById(R.id.item_icon); holder.textView = (TextView) itemView.findViewById(R.id.item_text); itemView.setTag(holder); } else { holder = (ViewHolder) itemView.getTag(); } SettingsItem settingsItem = items.get(position); if (settingsItem != null) { holder.textView.setText(settingsItem.getName()); new ImageDownloaderTask(holder.imageView, getContext(), settingsItem.getIcon_id()).execute(); } return itemView; } static class ViewHolder { ImageView imageView; TextView textView; } } 

Classe de rangée:

 public class SettingsItem{ private String name; private int icon_id; public SettingsItem(String a, int b){ super(); name=a; icon_id=b; } public String getName() { return name; } public int getIcon_id() { return icon_id; } } 

AsyncTask:

 class ImageDownloaderTask extends AsyncTask<String, Void, Bitmap> { private final WeakReference<ImageView> imageViewReference; Context context; int id; public ImageDownloaderTask(ImageView imageView, Context context, int id) { imageViewReference = new WeakReference<ImageView>(imageView); this.context=context; this.id=id; } @Override protected Bitmap doInBackground(String... params) { return BitmapFactory.decodeResource(context.getResources(),id ); } @Override protected void onPostExecute(Bitmap bitmap) { if (isCancelled()) { bitmap = null; } if (imageViewReference != null) { ImageView imageView = imageViewReference.get(); if (imageView != null) { if (bitmap != null) { imageView.setImageBitmap(bitmap); } else { imageView.setImageResource(R.drawable.medical_bag); } } } } } 

J'ai vraiment besoin d'aide pour cela.
Merci d'avance. 🙂

  • Redimensionner IMAGEVIEW sur l'échelle d'image Android
  • Largeur et hauteur maximale pour ImageView dans Android
  • Comment imiter l'application de téléphone de Lollipop, avec le redimensionnement des éléments supérieurs avant le contenu défilable?
  • ScrollView ne redimensionne pas directement après le changement d'enfant
  • Redimensionner Drawable dans Android
  • WindowSoftInputMode = "adjustResize" ne fonctionne pas avec l'action translucide / navbar
  • 3 Solutions collect form web for “ListView est très lent – l'Android”

    Pour créer des listes complexes dans vos applications, vous pouvez utiliser RecyclerView. En savoir plus sur la vue de recycler dans https://developer.android.com/training/material/lists-cards.html .

    Pour afficher des images, utilisez la glisse. https://github.com/bumptech/glide . C'est une bibliothèque géniale qui fait toute la gestion de la mémoire pour vous. Le chargement des bitmaps dans imageview est légèrement douloureux.

    Je vous recommanderais d'utiliser la bibliothèque Glide , cela entraînerait une performance pour le chargement d'image dans votre application et sa simplicité d'utilisation. Il supporte l'extraction, le décodage et l'affichage de photos, d'images et de GIF animés.

    Il permet de faire défiler n'importe quel type de liste d'images aussi douces et rapides que possible, mais Glide est également efficace pour presque tous les cas où vous devez rechercher, redimensionner et afficher une image distante.

    Glide est une structure de gestion des médias open source rapide et efficace et un cadre de chargement d'image pour Android qui enveloppe le décodage multimédia, la mémoire et la mise en cache de disque et le regroupement de ressources dans une interface simple et facile à utiliser.

    Ajout de Glide à votre projet:

     dependencies { compile 'com.github.bumptech.glide:glide:3.6.0' compile 'com.android.support:support-v4:19.1.0' } 

    Pour une utilisation de listview à partir de la page officielle, voici comme suit:

     @Override public View getView(int position, View recycled, ViewGroup container) { final ImageView myImageView; if (recycled == null) { myImageView = (ImageView) inflater.inflate(R.layout.my_image_view, container, false); } else { myImageView = (ImageView) recycled; } String url = myUrls.get(position); Glide.with(myFragment) .load(url) .centerCrop() .placeholder(R.drawable.loading_spinner) .crossFade() .into(myImageView); return myImageView; } 

    Pour faire référence à un autre projet qui utilise cette bibliothèque pour un chargement plus rapide de l'image et un meilleur défilement: https://github.com/chrisbanes/cheesesquare

    Vous pouvez utiliser le cache pour afficher plus rapidement. J'utilise picasso http://square.github.io/picasso il est vraiment utile d'afficher facilement des images et de gérer le cache. J'espère que cela aide.

     Picasso.with(context).load("file:///android_asset/DvpvklR.png").into(imageView2); 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.