携帯電話に音楽を保存しているアーティストごとに画像をダウンロードして、これらの画像をに表示しようとしていますGridView
。Last.fmが推奨するlastfm-javaライブラリを使用しています。アーティストの画像を取得するために呼び出すメソッドはですがgetImageURL(ImageSize size)
、これを行う前に、パラメータを使用して参照するアーティストを指定する必要がありString
ます。したがって、完全には次のようになります。
@Override
protected String doInBackground(Object... arg0) {
Artist artist = Artist.getInfo(artistOrMbid, LASTFM_API_KEY);
return artist.getImageURL(ImageSize.EXTRALARGE);
}
私の電話にいるすべてのアーティストを取得することは問題ではありません、あなたはただ参照しますMediaStore
。あなたはこのようなことをするでしょう:
private void getArtists() {
String[] projection = new String[] {
MediaStore.Audio.Artists._ID, MediaStore.Audio.Artists.ARTIST,
};
String sortOrder = MediaStore.Audio.Artists.DEFAULT_SORT_ORDER;
Cursor c = getActivity().getContentResolver().query(
MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI, projection, null, null, sortOrder);
if (c != null) {
int count = c.getCount();
if (count > 0) {
final int ARTIST_IDX = c.getColumnIndex(MediaStore.Audio.Artists.ARTIST);
for (int i = 0; i < count; i++) {
c.moveToPosition(i);
}
}
c.close();
c = null;
}
}
Adapter
私にとってはGridView
特別なことではなく、単に拡張するだけBaseAdapter
です。
注 AQueryは私が使用しているライブラリでありBitmap
、URLからのキャッシュとロードに役立ちます。
public class GridViewAdapter extends BaseAdapter {
private final String[] imageURLs;
private final LayoutInflater mInflater;
private final Activity mActivity;
public GridViewAdapter(String[] urls, Activity activity) {
imageURLs = urls;
mActivity = activity;
mInflater = (LayoutInflater)mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return imageURLs.length;
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewholder = null;
// Inflate GridView items
if (convertView == null) {
convertView = mInflater.inflate(R.layout.gridview_items, null);
viewholder = new ViewHolder();
viewholder.mImage = (ImageView)convertView.findViewById(R.id.gridview_image);
convertView.setTag(viewholder);
} else {
viewholder = (ViewHolder)convertView.getTag();
}
AQuery aq = new AQuery(convertView);
aq.id(viewholder.mImage).image(imageURLs[position], false, false, 0, 0, null, 0, 0.75f);
return convertView;
}
}
class ViewHolder {
public ImageView mImage;
}
完全に、私のAsyncTask
は次のとおりです。
public class LastfmArtistGetImageURL extends AsyncTask<Object, Integer, String[]> implements
Constants {
private static final String tag = LastfmArtistGetImageURL.class.getSimpleName();
private GridViewAdapter mGridAdapter;
// Test
private final String[] imageIds = {
"http://userserve-ak.last.fm/serve/252/71875544.png",
"http://userserve-ak.last.fm/serve/252/6258507.jpg",
"http://userserve-ak.last.fm/serve/252/51274303.png",
"http://userserve-ak.last.fm/serve/252/58672183.png",
"http://userserve-ak.last.fm/serve/252/72029714.png",
"http://userserve-ak.last.fm/serve/252/17666215.jpg",
"http://userserve-ak.last.fm/serve/252/63247381.png",
"http://userserve-ak.last.fm/serve/252/33665463.jpg"
};
private final String artistOrMbid;
private final GridView mGridView;
private final Activity mActivity;
public LastfmArtistGetImageURL(String name, GridView gv, Activity activity) {
artistOrMbid = name;
mGridView = gv;
mActivity = activity;
}
@Override
protected String[] doInBackground(Object... arg0) {
Artist artist = Artist.getInfo(artistOrMbid, LASTFM_API_KEY);
Collection<String> col = new ArrayList<String>();
col.add(artist.getImageURL(ImageSize.EXTRALARGE));
return col.toArray(new String[0]);
}
@Override
protected void onPostExecute(String[] result) {
if (result != null)
mGridAdapter = new GridViewAdapter(imageIds, mActivity);
mGridView.setAdapter(mGridAdapter);
super.onPostExecute(result);
}
}
を呼び出すときはAsyncTask
、次のgetArtists()
ようにメソッドで呼び出します。
new LastfmArtistGetImageURL(c.getString(ARTIST_IDX), mGridView, getActivity())
.execute();
問題
position 0
これを呼ぶと、すべてのアーティストの画像がダウンロードされますが、私のでは次々にダウンロードされますGridViewAdapter
。つまり、1つの画像が読み込まれ、次に次の画像が読み込まれます。最初に、でposition
使用可能なそれぞれの画像に画像を配置する必要があります。テストを返すと、すべてが正常に機能します。すべての画像は、の使用可能な各スペースに順番に配置されます。position
GridView
String[]
AsyncTask
GridView
質問
私の質問は、ダウンロードした各アーティストの画像をGridView
正しく返すにはどうすればよいですか。また、現在、画像が最初position
にのみ読み込まれているのはなぜGridViewAdapter
ですか。
編集-Shubhayuの答え
私はGridViewAdapter
自分のgetArtists()
方法をそのように設定するように移動しました。これにより、すべての画像がダウンロードされますが(LogCatによると)、最後の画像のみが私のに設定されますGridView
。
String[] test = new LastfmArtistGetImageURL(c.getString(ARTIST_IDX),
mGridView, getActivity()).execute().get();
mGridAdapter = new GridViewAdapter(test, getActivity());
mGridView.setAdapter(mGridAdapter);
smoakの回答
これにより、最後のアーティスト画像(デフォルトの順序)のみがダウンロードされ、私のに適用されますGridView
。
String[] test = {c.getString(ARTIST_IDX)};
new LastfmArtistGetImageURL(test, mGridView, getActivity()).execute();