À l'aide de AsyncTask de charger des images dans un adaptateur personnalisé

Bien qu'il existe de nombreux tutoriels, j'en ai trouvé ça vraiment difficile à mettre en œuvre une AsyncTask pour charger des images à partir d'URI (obtenu à partir d'un fournisseur de contenu) dans un adaptateur personnalisé.

- Je obtenir le sens de base, qui est d'avoir une classe contenant une AsyncTask, ne le bitmap de la création dans le 'doInBackground", puis l'ensemble de l'ImageView dans le onPostExecute.

Le problème pour moi, étant nouveau pour android & la programmation, c'est que je ne sais pas comment faire pour passer dans mes Uri de l'AsyncTask pour chaque élément, comment créer l'image, et comment revenir à la carte.

J'ai seulement obtenu jusqu'ici avec la classe AsyncTask (ImageLoader):

package another.music.player;

import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.widget.ImageView;

public class ImageLoader extends AsyncTask<String, String, Bitmap> {

    private ImageView imageView;
    private Bitmap bitmap = null;

    @Override
    protected Bitmap doInBackground(String... uri) {

        //Create bitmap from passed in Uri here

        return bitmap;

    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        if (bitmap != null && imageView != null) {
            imageView.setImageBitmap(bitmap);

        }
    }
}

Et ma coutume adaptateur ressemble à ceci:

package another.music.player;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.BaseColumns;
import android.provider.MediaStore.Audio.AlbumColumns;
import android.provider.MediaStore.Audio.AudioColumns;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import android.widget.ImageView;
import android.widget.TextView;
class AlbumAdapter extends CursorAdapter {
public AlbumAdapter(Context context, Cursor c, int flags) {
super(context, c, flags);
}
private static Uri currentSongUri;
@Override
public void bindView(View view, Context context, Cursor cursor) {
ImageView albumArt = (ImageView) view.getTag(R.id.albumArt);
TextView text1 = (TextView) view.getTag(R.id.artistTitle);
TextView text2 = (TextView) view.getTag(R.id.albumTitle);
TextView text3 = (TextView) view.getTag(R.id.totalSongs);
albumArt.setImageBitmap(null);
text1.setText(cursor.getString(cursor
.getColumnIndex(AudioColumns.ARTIST)));
text2.setText(cursor.getString(cursor
.getColumnIndex(AudioColumns.ALBUM)));
text3.setText(cursor.getString(cursor
.getColumnIndex(AlbumColumns.NUMBER_OF_SONGS)));
String currentAlbumId = cursor.getString(cursor
.getColumnIndex(BaseColumns._ID));
Integer currentAlbumIdLong = Integer.parseInt(currentAlbumId);
Uri artworkUri = Uri.parse("content://media/external/audio/albumart");
currentSongUri = ContentUris.withAppendedId(artworkUri,
currentAlbumIdLong);
//Run ImageLoader AsyncTask here, and somehow retrieve the ImageView & set it.
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.albumitem, null);
view.setTag(R.id.albumArt, view.findViewById(R.id.albumArt));
view.setTag(R.id.artistTitle, view.findViewById(R.id.artistTitle));
view.setTag(R.id.albumTitle, view.findViewById(R.id.albumTitle));
view.setTag(R.id.totalSongs, view.findViewById(R.id.totalSongs));
return view;
}
}

Je vous serais très reconnaissant si quelqu'un pouvait me montrer comment procéder à cet égard.

Grâce.

Avez-vous développé cette application appelée Navette Lecteur de Musique ?
Salut, oui je l'ai fait. Je suis plus que familier avec AsyncTasks maintenant!
Vous devriez être en utilisant AsyncTask à l'extérieur de la Carte, puis de remplir à nouveau les résultats une fois qu'il a terminé.

OriginalL'auteur Tim Malseed | 2012-08-02