1

我有一個Lazy適配器,將標題,副標題和圖片添加到ListView。最近我一直注意到我的ListView中我的圖像被重複。LazyAdapter複製圖像

這裏就是我我的陣列添加到適配器

protected void onPostExecute(String result) {     
    LazyAdapter adapter = new LazyAdapter(Services.this,menuItems);  
    serviceList.setAdapter(adapter); 
} 

這裏就是我所謂的異步方法來添加我的圖像(其網址這就是爲什麼它是一個異步方法)

vi.findViewById(R.id.thumbnail).setVisibility(View.VISIBLE); 
title.setText(items.get("title")); // Set Title 
listData.setText(items.get("htmlcontent")); // Set content   
thumb_image.setBackgroundResource(R.layout.serviceborder);//Adds border 
new setLogoImage(thumb_image).execute(); // Async Method call 

而且這裏是我把我的位圖圖像

private class setLogoImage extends AsyncTask<Object, Void, Bitmap> { 
     private ImageView imv;    

     public setLogoImage(ImageView imv) { 
      this.imv = imv;     
     } 

    @Override 
    protected Bitmap doInBackground(Object... params) { 
     Bitmap bitmap = null; 
     try {    
      bitmap = BitmapFactory.decodeStream((InputStream)new URL(items.get("thumburl")).getContent()); 

     } catch (MalformedURLException e) {    
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return bitmap; 
    } 
    @Override 
    protected void onPostExecute(Bitmap result) {   
     imv.setImageBitmap(Bitmap.createScaledBitmap(result, 50, 50, false)); 
    } 
} 

items變量是一個存儲我的信息的HashMap。我得到了賦給適配器的數據的位置並將其分配給項目HashMap。像這樣:

items = new HashMap<String, String>(); 
items = data.get(position); 

出現這種情況隨機,現在看來,它很煩人看到錯誤畫面出現的時間大約30%,尤其是當我試圖調試。

任何幫助將是偉大的。由於

這裏是看發生了什麼 enter image description here

+0

如果你想這樣做更友好的方式,你可以使用[通過koush'UrlImageViewHelper'項目。(https://github.com/koush/UrlImageViewHelper) – tolgap

回答

1

你有一些隨機發生的任何時候的圖像,你有什麼樣的一個線程,你應該考慮兩件作品,競爭條件。基本上,你的AsyncTasks都加載相同的圖像。他們應該被傳入加載的值。我注意到你沒有用params做任何事情。我不確定你應該怎麼做,但問題出在你AsyncTask的某個地方。

@Override 
protected Bitmap doInBackground(Object... params) { 
    Bitmap bitmap = null; 
    try {    
     bitmap = BitmapFactory.decodeStream((InputStream)new URL(items.get("thumburl")).getContent()); 

    } catch (MalformedURLException e) {    
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    return bitmap; 
} 

您應該傳遞URL(或者它代表的字符串)。在這個例子中,我傳入了URL,但可以隨意改變它的方式。關鍵在於,您應該將圖像位置的表示形式傳遞給函數,而不是試圖找出在函數中使用的圖像。

new setLogoImage(new Url(items.get("thumburl"))).execute(); // Async Method call 


@Override 
protected Bitmap doInBackground(Url... input) { 
    Bitmap bitmap = null; 
    try {    
     bitmap = BitmapFactory.decodeStream((InputStream)input[0]).getContent()); 

    } catch (MalformedURLException e) {    
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    return bitmap; 
} 
+0

你可以把這個字符串,但關鍵是要傳遞你想要使用的東西,不要試圖將其放入AsyncTask中。 – PearsonArtPhoto

+0

那麼隨着你的代碼,我得到一個「不能從URL轉換到InputStream」。有任何想法嗎? – BigT

+1

或者,您可以只傳遞'items.get(「thumburl」)',並進行與原來相同的轉換。 – PearsonArtPhoto