我正在尝试在具有 ArrayAdapter 的 ListView 中添加图像。仅供参考,toList() 是从迭代器到给定 DBObject 列表的转换。
我覆盖View getView()
并设置了一个文本视图和一个图像。
private static class EventAdapter extends ArrayAdapter<DBObject> {
public EventAdapter(Context context, int resource, Iterable<DBObject> events) {
super(context, resource, toList(events));
}
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
LayoutInflater vi = LayoutInflater.from(getContext());
v = vi.inflate(R.layout.adapter_event_list, null);
DBObject event = getItem(position);
if (event != null) {
//Get the logo if any
if( ((DBObject)event.get("events")).containsField("logo") ){
String logoURL = ((DBObject)((DBObject)event.get("events")).get("logo")).get("0").toString();
ImageView eventLogo = (ImageView) v.findViewById(R.id.eventLogoList);
new setLogo().execute(logoURL, eventLogo);
}
TextView title= (TextView) v.findViewById(R.id.eventTitleList);
title.setText( ((DBObject)event.get("events")).get("title").toString() );
}
return v;
}
protected static <T> List<T> toList( Iterable<T> objects ) {
final ArrayList<T> list = new ArrayList<T>();
for( T t : objects ) list.add(t);
return list;
}
//setLogo() method here. See below
}
文本视图中的文本很好。然而,图像变得一团糟。它们似乎加载到列表中的错误位置。代码的路线是:1)从数据库获取(异步)2)填充ListView 3)同时填充加载每个图像(第二个异步)。
这是上面的setLogo()
AsyncTask EventAdapter
:
private class setLogo extends AsyncTask<Object,Void,Bitmap>{
ImageView eventLogo = null;
@Override
protected Bitmap doInBackground(Object...params) {
try{
Bitmap eventImage = downloadBitmap((String) params[0]);
eventLogo = (ImageView) params[1];
return eventImage;
}
catch(Exception e){
e.printStackTrace();
return null;
}
}
@Override
protected void onPostExecute(Bitmap eventImage) {
if(eventImage!=null && eventLogo!=null){
eventLogo.setImageBitmap(eventImage);
}
}
}
我这样做了(使用异步),我相信这是从 url 加载图像的正确方法。我在多线程上看到了这篇文章,并从中借用了该downloadBitmap()
方法。
如上所述,图像加载到 ListView 的错误位置。什么是加载它们的可靠方法?
此外,传递v.findViewById(R.id.eventLogoList)
AsyncTask 内部的想法是程序将区分每个适配器的 ImageView,但似乎没有。
更新
在关注导致这种混合的问题之后,我发现了这个 SO question。
我更改了我的代码以检查是否if
导致问题。
//Get the logo if any
if( ((DBObject)event.get("events")).containsField("logo") ){
String logoURL = ((DBObject)((DBObject)event.get("events")).get("logo")).get("0").toString();
ImageView eventLogo = (ImageView) row.findViewById(R.id.eventLogoList);
//new setLogo().execute(logoURL, eventLogo);
TextView title= (TextView) row.findViewById(R.id.eventTitleList);
title.setText( "Shit happens" );
}
假设我有 40 件商品。Shit happens
设置在字段存在的字段上logo
。如果我向下/向上滚动,顺序会发生变化,并且文本会变得混乱。这是因为在循环内创建的堆栈小于列表的最大值..我想......我还在挣扎。
PS:我发现这个简单的库可以异步加载图像而不是 DYI 的东西。
更新 2
我添加了一个带有静态网址的 else 。由于加载图像所需的时间,它们仍然放错了位置。