我試圖在具有ArrayAdapter的ListView中添加圖像。 Fyi,toList()是從迭代器到給定DBObject列表的轉換。在ListView適配器中加載位圖/圖像
我覆蓋View getView()
並設置了一個textview和一個圖像。
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
}
textview中的文本沒問題。然而,圖像越來越混亂。他們似乎在列表中錯誤的地方加載。代碼的路由是: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);
}
}
}
我這樣做(使用一個異步),我認爲是從網址加載圖像的正確方法。我看到這post on multithreading,並從中借用了downloadBitmap()
方法。
如上所述,圖像被加載到ListView的錯誤位置。什麼可以是一個強大的方式來加載它們?
此外,在AsyncTask中傳遞v.findViewById(R.id.eventLogoList)
的想法是程序將區分每個適配器的ImageView,但似乎沒有。
更新
以下是造成這個組合,我發現this 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:我發現this easy library異步加載圖像,而不是DYI的東西。
更新2
我添加了其他用靜態的URL。由於圖像加載所花費的時間,他們仍然錯位。
感謝圖書館,我試了一下,但內容仍然混雜在一起。 – Diolor