1

我試圖在具有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。由於圖像加載所花費的時間,他們仍然錯位。

回答

0

我真的會去找像畢加索這樣的好圖書館。 它會處理所有困難的部分,它寫得很好。 http://square.github.io/picasso/

+0

感謝圖書館,我試了一下,但內容仍然混雜在一起。 – Diolor

相關問題