À l'aide de AsyncTask pour charger les Images dans la ListView

J'ai une ListView qui peut contenir une image. Cela dépend si l'image existe ou pas dans SDCARD.

Voici mon code d'exemple:

public class MainActivity extends Activity  {
ListView mListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mListView = new ListView(this);
setContentView(mListView);
String[] arr = new String[] { 
"/example/images/1.jpg", "/example/images/2.jpg",  
"/example/images/3.jpg", "/example/images/4.jpg",  
"/example/images/5.jpg", "/example/images/6.jpg", 
"/example/images/7.jpg", "/example/images/8.jpg",  
"/example/images/9.jpg", "/example/images/1.jpg", 
"/example/images/2.jpg", "/example/images/3.jpg",  
"/example/images/4.jpg", "/example/images/5.jpg",  
"/example/images/6.jpg", "/example/images/7.jpg",  
"/example/images/8.jpg", "/example/images/9.jpg", 
"/example/images/1.jpg", "/example/images/2.jpg",  
"/example/images/3.jpg", "/example/images/4.jpg",  
"/example/images/5.jpg", "/example/images/6.jpg", 
"/example/images/7.jpg", "/example/images/8.jpg",  
"/example/images/9.jpg", "/example/images/1.jpg", 
"/example/images/2.jpg", "/example/images/3.jpg",  
"/example/images/4.jpg", "/example/images/5.jpg",  
"/example/images/6.jpg", "/example/images/7.jpg",  
"/example/images/8.jpg", "/example/images/9.jpg"}; 
List<String> list = Arrays.asList(arr);
MyAdapter adapter = new MyAdapter(this, R.layout.listitem_imv, list);
mListView.setAdapter(adapter);
}
class MyAdapter extends ArrayAdapter<String>{
List<String> mList;
LayoutInflater mInflater;
int mResource;
public MyAdapter(Context context, int resource,
List<String> objects) {
super(context, resource, objects);
mResource = resource;
mInflater = getLayoutInflater();
mList = objects;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
if(convertView == null){
view = mInflater.inflate(mResource, null);
}else{
view = convertView;
}
ImageView imageView = (ImageView) view.findViewById(R.id.imv);
TextView textView = (TextView) view.findViewById(R.id.txv);
imageView.setTag(mList.get(position));//tag of imageView == path to image
new LoadImage().execute(imageView);
textView.setText(mList.get(position).toString());
return view;
}       
}
class LoadImage extends AsyncTask<Object, Void, Bitmap>{
private ImageView imv;
private String path;
@Override
protected Bitmap doInBackground(Object... params) {
imv = (ImageView)   params[0];
path = imv.getTag().toString();
Bitmap bitmap = null;
File file = new File( 
Environment.getExternalStorageDirectory().getAbsolutePath() + path);
if(file.exists()){
bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
}
return bitmap;
}
@Override
protected void onPostExecute(Bitmap result) {
if(result != null && imv != null){
imv.setVisibility(View.VISIBLE);
imv.setImageBitmap(result);
}else{
imv.setVisibility(View.GONE);
}
}
}
}

'Sdcard/exemple/les images d'un répertoire a les images: 1.jpg, 2.jpg, 3.jpg, 4.jpg, 6.jpg, 7.jpg et 9.jpg.
le résultat attendu est:
À l'aide de AsyncTask pour charger les Images dans la ListView

Mais, si j'ai faites défiler la liste rapidement, certaines images sont insérées dans les articles faux.
Il se produit en raison de l'utilisation de convertView dans getView ().

Si j'utilise le code suivant, le code fonctionne:

        //if(convertView == null){
// view = mInflater.inflate(mResource, null);
//}else{
// view = convertView;
//}
view = mInflater.inflate(mResource, null);

Lorsque la liste défile rapidement, deux asyncTasks peut faire référence à un même point de Vue, en raison de l'utilisation de convertView.
Comment puis-je annuler AsyncTask lorsque la Vue n'est plus visible?(et est useb par un autre élément de la Liste)

modifier

            @Override
protected void onPostExecute(Bitmap result) {
if(result != null && imv != null){
if(imv.getTag().equals(path)){
imv.setVisibility(View.VISIBLE);
imv.setImageBitmap(result);
}else{
imv.setVisibility(View.GONE);
}
}else{
imv.setVisibility(View.GONE);
}
}

OriginalL'auteur Rodrigo | 2011-10-11