Android ListView mise à jour des vignettes d'image à l'aide de AsyncTask Causes Voir le recyclage
J'ai essayé d'obtenir des vignettes de travailler avec une AsyncTask pour les fichiers d'image dans un contrôle ListView.
J'ai eu le problème commun de la Ligne de Recyclage, et donc sur le défilement des vignettes attribuées à tort lignes. J'ai essayé d'ajouter des balises à l'ImageView et puis en confirmant les balises dans le onPostExecute() dans l'AsyncTask, mais ont échoué dans mes tentatives. Quelqu'un s'il vous plaît aider!
La coutume adaptateur est comme suit :
public class MySimpleAdapter extends SimpleAdapter {
public MySimpleAdapter(Context context,
List<? extends Map<String, ?>> data, int resource,
String[] from, int[] to) {
super(context, data, resource, from, to);
//TODO Auto-generated constructor stub
}
public View getView(int position, View convertView, ViewGroup parent) {
final View v = super.getView(position, convertView, parent);
thumbnail = (ImageView) v.findViewById(R.id.thumbnail);
checker = (CheckBox) v.findViewById(R.id.checkBox);
filenametext = (TextView) v.findViewById(R.id.text1);
String pathtoimage = startLocation.concat("/"
+ filenametext.getText().toString());
desctext = (TextView) v.findViewById(R.id.text2);
String temp = desctext.getText().toString();
if (temp.equals("Directory") == true) {
checker.setEnabled(false);
switch (theme) {
case 0:
thumbnail.setImageResource(R.drawable.folder_light);
break;
case 1:
thumbnail.setImageResource(R.drawable.folder_dark);
break;
}
} else {
checker.setEnabled(true);
if (filenametext.getText().toString().endsWith(".jpg")
|| filenametext.getText().toString().endsWith(".png")
|| filenametext.getText().toString().endsWith(".bmp")) {
Boolean hashmapfound = false;
for (HashMap.Entry<String, Bitmap> entry : thumbnaillist
.entrySet()) {
String key = entry.getKey();
if (key.equals(filenametext.getText().toString())) {
Log.d(TAG, "HashMapKey Found!");
thumbnail.setImageBitmap(entry.getValue());
hashmapfound = true;
}
}
if (!hashmapfound) {
Log.d(TAG, "NO HashMapKey Found! Adding to HashMap!");
switch (theme) {
case 0:
thumbnail
.setImageResource(R.drawable.unknown_image_light);
break;
case 1:
thumbnail
.setImageResource(R.drawable.unknown_image_dark);
break;
}
thumbnail.setTag((filenametext.getText().toString()));
new GetBitMaps(thumbnail).execute(pathtoimage,
filenametext.getText().toString());
}
} else {
switch (theme) {
case 0:
thumbnail.setImageResource(R.drawable.file_light);
break;
case 1:
thumbnail.setImageResource(R.drawable.file_dark);
break;
}
}
}
return v;
}
}
L'AsyncTask est comme suit :
class GetBitMaps extends AsyncTask<String, Void, Bitmap> {
private ImageView thumbnail;
private String imageName;
public GetBitMaps(ImageView thumb) {
//TODO Auto-generated constructor stub
thumbnail = thumb;
}
@Override
protected Bitmap doInBackground(String... pathtoimage) {
Bitmap bmp = createThumbnail(pathtoimage[0]);
thumbnaillist.put(pathtoimage[1], bmp);
imageName = pathtoimage[1];
return bmp;
}
@Override
protected void onPostExecute(Bitmap bmp) {
if (((String) thumbnail.getTag()).equals(imageName)) {
thumbnail.setImageBitmap(bmp);
}
}
private Bitmap createThumbnail(String filepath) {
Bitmap bmp = BitmapFactory.decodeFile(filepath);
int w = bmp.getWidth();
int h = bmp.getHeight();
if (w > h) {
w = 80;
h = 40;
} else if (w < h) {
w = 40;
h = 80;
}
bmp = Bitmap.createScaledBitmap(bmp, w, h, true);
return bmp;
}
}
Je ne peux toujours pas comprendre ce que d'autre à faire dans l'ordre pour obtenir les Vignettes pour un affichage en lignes correctes PENDANT le DÉFILEMENT.
Veuillez Noter: Après le défilement à l'écart de lignes affectées et le défilement vers le bas, les choses fonctionnent bien, mais le problème de défilement ne va pas plus loin!
source d'informationauteur Daksh
Vous devez vous connecter pour publier un commentaire.
De ce blog:
Ce que vous voulez faire est de l'exécution de toutes les par ligne IO ou lourds lié au PROCESSEUR de routine de façon asynchrone dans un thread séparé. L'astuce ici est de le faire et toujours en conformité avec ListView est le comportement de recyclage. Par exemple, si vous exécutez un AsyncTask pour charger une photo de profil dans la carte getView(), le point de vue que vous êtes en train de charger l'image peut être recyclé pour une autre position avant de l'AsyncTask finitions. Donc, vous avez besoin d'un mécanisme de savoir si la vue n'a pas été recyclé une fois que vous avez terminé avec l'opération asynchrone.
Un moyen simple d'y parvenir est d'attacher un morceau de l'information à la vue qui identifie la ligne qui lui est associé. Vous pouvez aussi vérifier si la ligne cible pour le point de vue est toujours le même lorsque l'opération asynchrone se termine. Il existe de nombreuses façons d'y parvenir. Ici est juste de la simple esquisse d'une façon pour vous de le faire:
À l'aide de l'AsyncTask.THREAD_POOL_EXECUTOR wil fin de l'exécution de plusieurs threads pour aller chercher de l'thumnails.
Il n'y a pas d'ordre dans la manière de les exécuter ou de finisch et définir l'image pour l'afficher. Lors du défilement en arrière vous pouvez vous retrouver avec de mauvaises images dans vos vues.
J'ai testé l'AsyncTask.THREAD_POOL_EXECUTOR et ça conduit à la mauvaise image de certains points de vue.
vous pouvez essayer de passer dans la ListView dans votre Adaptateur constructeur de votre activité (peut-être même dans votre tâche asynchrone dépend de comment vous voulez le mettre en œuvre).
et de comparer la position à l'aide getFirstVisiblePosition() et getLastVisiblePosition() à l'encontre de votre
mPosition