我在这里和其他地方阅读了很多关于在自定义列表视图中加载图像的帖子,但我一无所获!所以,我想我最好问问!
情况如下:
我有一个活动,上面有一个包含 6 个项目的列表视图(比如说 Item1、Item2 等)。当用户单击一个项目时,我使用另一个列表视图启动一个新活动,但这次列表视图是一个带有图像和一些文本的自定义视图。
第一个活动的 onCreate 方法是这样的:
GetImageFromURL eventImageLoader = new GetImageFromURL(FirstActivity.this, eventMultimediaID);
eventImageLoader.execute();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
CustomAdapter adapter = new CustomAdapter(this, android.R.layout.simple_expandable_list_item_1, R.id.textView1, eventName, bitmap);
eventList = (ListView) findViewById(R.id.secEventList);
eventList.setAdapter(adapter);
eventList.setOnItemClickListener(eventNameListClickListener);
我创建并启动 AsyncTask 以将图像加载到位图列表中。
eventMultimediaID 是一个字符串数组,eventName 也是如此。
GetImageFromURL 任务是这样的:
public class GetImageFromURL extends AsyncTask<Void, Void, List<Bitmap>>
{
private ProgressDialog progressDialog = null;
private Context callingContext = null;
private List<Bitmap> bitmap = new ArrayList<Bitmap>();
private String[] eventMultimediaID = null;
public GetImageFromURL(Context callingContext, String[] eventMultimediaID)
{
this.callingContext = callingContext;
this.eventMultimediaID = eventMultimediaID;
}
@Override
protected void onPreExecute()
{
super.onPreExecute();
progressDialog = ProgressDialog.show(callingContext, "Loading Events", "Retrieving data from server, please wait...", true);
}
@Override
protected List<Bitmap> doInBackground(Void... params)
{
try
{
int length = eventMultimediaID.length;
for(int i = 0; i < length; i++)
{
URL imageUrl = new URL("https://www.blahblah/servlet?blahblah=" + eventMultimediaID[i]);
bitmap.add(i, BitmapFactory.decodeStream(imageUrl.openConnection().getInputStream()));
}
}
catch (IOException e)
{
e.printStackTrace();
}
return bitmap;
}
@Override
protected void onPostExecute(List<Bitmap> bitmap)
{
for(int i = 0; i < bitmap.size(); i++)
{
ShowEventCategory.bitmap.add(i, bitmap.get(i));
}
progressDialog.dismiss();
}
}
这是CustomAdapter:
public class CustomAdapter extends ArrayAdapter<String>
{
private Context currentContext;
private String[] data;
private List<Bitmap> evImage;
public CustomAdapter(Context context, int resource, int textViewResourceId, String[] objects, List<Bitmap> bitmap)
{
super(context, resource, textViewResourceId, objects);
this.currentContext = context;
this.data = objects;
this.evImage = bitmap;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
LayoutInflater inflater = (LayoutInflater) currentContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View eventListItem = inflater.inflate(R.layout.show_event_category_list_item, parent, false);
ImageView eventListItemImage = (ImageView) eventListItem.findViewById(R.id.eventImage);
TextView eventListItemText = (TextView) eventListItem.findViewById(R.id.eventText);
eventListItemText.setText(data[position]);
eventListItemImage.setImageBitmap(evImage.get(position));
return eventListItem;
}
}
我试图做的是从 Activity 调用异步任务来加载图像,同时显示一个加载对话框。加载完成后,对话框关闭,适配器获取填充的位图数组。
这行不通。任务启动后,执行继续(我认为这应该发生)并且适配器得到一个空数组,所以我得到一个 OutOfBoundsException。这就是为什么我将 Thread.sleep(5000) 放在主线程中等待加载操作完成的原因。但这当然不是一个可接受的解决方案!
:( 有什么建议吗?!我花了一整天的时间在这件事上!!!!提前谢谢!