拡張するGridView
を含む があります(Album は LastFM API から取得したアルバム情報です)。Adapter
ArrayAdapter<Album>
このAlbum
情報には、画像への URL が含まれています。それらの画像を非同期にダウンロードAdapter
し、アルバム名とともに に入れます。
ただし、GridView
上下にスクロールすると、行がリサイクルされます。それらを再び膨らませると、画像が入れ替わり、何が起こっているのかよくわかりません。
私はHashMap<String, Bitmap>
無駄に画像を保存しようとしました。
これが私のコードですAdapter
package com.gigtracker.adapter;
import java.text.DecimalFormat;
import java.util.Collection;
import java.util.HashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.util.TypedValue;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import com.garli.lastfmapi.Album;
import com.garli.lastfmapi.Artist;
import com.garli.lastfmapi.ImageSize;
import com.gigtracker.R;
import com.gigtracker.utils.ImageDownloader;
public class AlbumAdapter extends ArrayAdapter<Album> {
private final ImageDownloader d;
int playcount;
@SuppressLint("UseSparseArrays")
private final HashMap<Integer, View> map = new HashMap<Integer, View>();
public AlbumAdapter(final Context ctx, final Artist artist) {
super(ctx, 0);
d = new ImageDownloader();
new AsyncTask<Void, Void, Void>() {
CopyOnWriteArrayList<Album> albums = new CopyOnWriteArrayList<Album>();
@Override
protected Void doInBackground(final Void... params) {
final Collection<Album> albumCollection = Artist
.getTopAlbums(artist.getName());
for (final Album album : albumCollection) {
if (playcount < album.getPlaycount()) {
playcount = album.getPlaycount();
}
albums.add(album);
}
return null;
}
@Override
protected void onPostExecute(final Void result) {
for (final Album album : albums) {
add(album);
}
notifyDataSetChanged();
}
}.execute();
}
@Override
public View getView(final int position, View convertView,
final ViewGroup parent) {
final TextView tv, tv2;
final ImageView iv;
final Album album = getItem(position);
if (map.get(Integer.valueOf(position)) == null) {
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(
R.layout.grid_item, null);
tv = (TextView) convertView.findViewById(R.id.textViewName);
iv = (ImageView) convertView.findViewById(R.id.imageView1);
tv2 = (TextView) convertView.findViewById(R.id.textViewRating);
@SuppressWarnings("deprecation")
int buttonDimension = ((Activity) getContext())
.getWindowManager().getDefaultDisplay().getWidth() / 2;
final int paddingTotal = (int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 20, getContext()
.getResources().getDisplayMetrics());
buttonDimension -= paddingTotal;
iv.getLayoutParams().height = buttonDimension;
iv.getLayoutParams().width = buttonDimension;
new AsyncTask<Void, Void, Void>() {
Bitmap bmp;
@Override
protected Void doInBackground(final Void... params) {
bmp = d.downloadBitmap(album
.getImageURL(ImageSize.LARGE));
return null;
}
@Override
protected void onPostExecute(final Void result) {
iv.setImageBitmap(bmp);
}
}.execute();
} else {
tv = (TextView) convertView.findViewById(R.id.textViewName);
tv2 = (TextView) convertView.findViewById(R.id.textViewRating);
}
} else {
convertView = map.get(Integer.valueOf(position));
tv = (TextView) convertView.findViewById(R.id.textViewName);
tv2 = (TextView) convertView.findViewById(R.id.textViewRating);
}
tv.setText(album.getName());
final float percentage = 100 * (float) album.getPlaycount() / playcount;
tv2.setText(new DecimalFormat("##0.00").format(percentage) + "%");
if (percentage >= 90) {
tv2.setTextColor(0xff99ff33);
} else if (percentage >= 75) {
tv2.setTextColor(0xffffff66);
} else if (percentage >= 50) {
tv2.setTextColor(0xffff9900);
} else if (percentage >= 25) {
tv2.setTextColor(0xffcc6600);
} else {
tv2.setTextColor(0xffcc0000);
}
return convertView;
}
}