2013-10-16 35 views
0

我搜索了這麼多,但我不能幫助自己。 有沒有人可以說我的ListView如何解決OutOfMemoryError問題。 只有在我的ListView中添加了50多個位圖後纔會出現。 據我所知,由於所有的位圖,設備內存已滿,但是有沒有辦法回收遠離視口的位圖?Listview with bitmaps,outofmemoryerror

這裏是我的ListView適配器:

public class ImageAdapter extends ArrayAdapter<ExtendedBitmap>{ 
    private LinkedList<ExtendedBitmap> items; 
    LayoutInflater mInflater = LayoutInflater.from(getContext()); 

    public ImageAdapter(Context context, int resource, LinkedList<ExtendedBitmap> items) { 
     super(context, resource, items); 
     this.items = items; 
    } 

    public void add(ExtendedBitmap bitmap) 
    { 
     items.add(bitmap); 
     notifyDataSetChanged(); 
    } 

    public void addFirst(ExtendedBitmap bitmap) 
    { 
     items.addFirst(bitmap); 
     notifyDataSetChanged(); 
    } 

    public ExtendedBitmap getBitmap(int position){ 
     return items.get(position); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent){ 
     ViewHolder holder; 

     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.extended_image, parent, false); ; 
      holder = new ViewHolder(); 
      holder.image = (ImageView) convertView.findViewById(R.id.image); 
      //holder.image.setOnTouchListener(new Touch()); 
      convertView.setTag(holder); 
     }else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.image.setImageBitmap(items.get(position).getBitmap()); 

     return convertView; 
    } 
} 
+2

位圖和內存不足問題在Android中猖獗。從側邊欄到右側,這似乎回答您的問題:http://stackoverflow.com/questions/477572/strange-out-of-memory-issue-while-loading-an-image-to-a-bitmap-對象 –

+0

他們談得有點太籠統 –

回答

1

你應該先了解一個ArrayAdapter是如何工作的。

當您使用super(context, resource, items);調用super的構造函數時,它會獲得對您正在使用的集合(項目)的引用。你不需要在你的課堂中保留對該集合的引用。

,該指令將讓你在LinkedList的當前項目將被顯示在當前視圖中的一個:

ExtendedBitmap bitm = getItem(position); 

您應該從Activity項目添加到集合,並從那裏調用notifyDataSetChanged();。 ArrayAdapter將知道該怎麼做。其次,您不應該在ViewHolder中保留實際的位圖。您應該存儲位圖的資源ID或URL,並且只在getView()中獲取實際的位圖。

您可以使用LruCache來放置位圖。然後,您需要邏輯來嘗試從LruCache獲取位圖,或根據需要重新創建它(如果需要)。

希望這會有所幫助。我從Big Nerd Ranch Android書中瞭解到了這一點。

+0

我在我的Activity中使用了notifyDataSetChanged(),它運行良好。我會嘗試下載每個位圖並將View資源中的資源ID存儲在ViewHolder中,但這是這種問題的常用解決方案嗎? –

+0

我也是新人。我不知道「通常的解決方案」是什麼,但是最近編寫了BNR書,作者正在爲本書論壇積極回答問題。如果我要寫一個類似的應用程序,我會認爲他們的解決方案是一個起點,然後研究如何改進它以使我的實現更好。閱讀側欄上的其他Q/A將是一個好的開始。 –

+0

看來,LruCache做到了。非常感謝您的建議! –