我試圖下載每個擁有手機音樂的藝術家的圖像,然後在GridView
中顯示這些圖像。我正在使用Last.fm建議使用的lastfm-java library。您調用來獲取藝術家圖像的方法是getImageURL(ImageSize size)
,但在執行此操作之前,您需要通過參數String
來告訴它要引用哪個藝術家。所以,完全會是這樣的:將光標與AsyncTask一起使用
@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是我使用,可以幫助緩存和從URL加載一個Bitmap
庫。
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();
問題
當我打電話給這個時候,所有的藝術家圖片都下載了,但是他們一個接一個地下載我的GridViewAdapter
的position 0
。換句話說,當我需要將它們放入GridView
中的每個可用position
中時,首先加載一個圖像,然後下一個,等等全部在第一個position
中。當我在我的AsyncTask
中返回我的測試String[]
時,一切正常。所有圖像按照GridView
的每個可用空間順序排列。
問題
我的問題是,我該如何正確地在我的GridViewAdapter
返回每個藝術家圖像我下載到我的GridView
和爲什麼圖像目前只裝載在第一position
?
編輯 - 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();
是否在循環中調用LastfmArtistGetImageURL()以覆蓋光標中的所有藝術家?併爲每個電話回來多少圖片?我假設每個藝術家1人。 – Shubhayu 2012-04-09 05:28:41
GridView期待的是一系列圖像,但是當你將一個圖像傳遞到另一個圖像時,它將被放置在第0個位置。立即返回完整數組並調用GridView適配器。那麼它會按預期工作 – user1203673 2012-04-09 05:30:38
@Shubhayu是的,沒錯。下載所有圖像不是問題,將它們正確放置在我的'Adapter'中。 @ user1203673因爲這個原因,我的'AsyncTask'返回一個'String []',當我使用我的測試'String []'時,一切正常,所以我不確定我明白你的意思。 – adneal 2012-04-09 05:42:06