2012-05-29 36 views
1

我在gridview滾動中遇到了問題。我已經做了一個自定義的gridview,並在原始文件中插入小部件,並通過視圖擴大它們。我得到了正確的結果和正確的數據,一切都很順利,但是當我將gridview滾動3-4次向下滾動時,它會產生一個OutOfMemoryExceptionOutOfMemoryException滾動很多時間

這個應用程序包含已安裝的應用程序列表的列表和圖標

這裏是我的custome適配器的代碼:

package com.AppFavorits; 

import java.util.ArrayList; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.drawable.BitmapDrawable; 
import android.graphics.drawable.Drawable; 
import android.os.AsyncTask; 
import android.view.Gravity; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.ViewGroup.LayoutParams; 
import android.widget.BaseAdapter; 
import android.widget.CheckBox; 
import android.widget.ImageView; 
import android.widget.RelativeLayout; 
import android.widget.TextView; 

import com.AppFavorits.ImageLoad.ImageLoader; 

public class GriedViewAdapter extends BaseAdapter { 
    private Context activit; 
    LayoutInflater inflator; 
    public RelativeLayout imgvGridItem; 
    public TextView txtGridItemlabel; 
    public CheckBox chkbxGridItem; 
    ArrayList<PInfo> lstpinfo = new ArrayList<PInfo>(); 
    public ImageLoader imageLoader; 
    public GriedViewAdapter(Context m1, ArrayList<PInfo> lstpinfo) { 

      activit = m1; 
      inflator = LayoutInflater.from(m1); 
      this.lstpinfo = lstpinfo; 
       imageLoader=new ImageLoader(m1.getApplicationContext()); 

     } 

    public static class ViewHolder { 

    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     ViewHolder view; 
     // LayoutInflater inflator = activit.getLayoutInflater(); 


     view = new ViewHolder(); 
     convertView = inflator.inflate(R.layout.griedviewrow, null); 

     imgvGridItem = (RelativeLayout) convertView 
       .findViewById(R.id.rlGreidItemicon); 
     txtGridItemlabel = (TextView) convertView 
       .findViewById(R.id.txtGridItemlabel); 
     chkbxGridItem = (CheckBox) convertView 
       .findViewWithTag(R.id.chkbxGridItem); 
     if ((lstpinfo.get(position).appname.toString()) != null){ 
      Drawable d = lstpinfo.get(position).icon; 
      //new ImageLoad().execute(); 

      imgvGridItem.addView(getimageviewimage(lstpinfo.get(position).icon)); 
      txtGridItemlabel.setText(lstpinfo.get(position).appname.toString()); 

      // convertView.setTag(view); 
     } 

     return convertView; 

    } 

    @Override 
    public int getCount() { 
     return lstpinfo.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return lstpinfo.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    public RelativeLayout getimageviewimage(Drawable d) { 
     RelativeLayout seprator = new RelativeLayout(activit); 
     seprator.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, 
       LayoutParams.WRAP_CONTENT)); 
     seprator.setGravity(Gravity.LEFT | Gravity.CENTER); 

     ImageView imgmap = new ImageView(activit); 
     imgmap.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, 
       LayoutParams.WRAP_CONTENT)); 
     // imgmap.setBackgroundResource(R.drawable.a13); 
     Bitmap bitmap = ((BitmapDrawable)d).getBitmap(); 
     imageLoader.DisplayImage(bitmap, imgmap); 

     //imgmap.setImageBitmap(bitmap); 
     seprator.setPadding(5, 5, 15, 5); 
     seprator.addView(imgmap); 

     return seprator; 

    } 
    private class ImageLoad extends AsyncTask<Void, Void, Void> { 
      // private final ProgressDialog dialog = new ProgressDialog(tranning.this); 
      protected void onPreExecute() { 
      // this.dialog.setMessage("Please Wait..."); 
      // this.dialog.show(); 
       // put your code which preload with processDialog 
      } 
       @Override 
       protected Void doInBackground(Void... arg0) { 
        // put your code here 
        return null; 
       } 

      @Override 
      protected void onPostExecute(final Void unused) { 
       /*if (this.dialog.isShowing()) { 
       this.dialog.dismiss(); 
      } */ 
      } 
     } 
} 

我覺得有什麼問題getview

+0

使用延遲加載或異步任務解決這個問題。 –

+0

你可以舉一些例子 –

+0

檢查我的答案,如果你有任何疑問,不要告訴我。 –

回答

0

out of memory通常意味着沒有足夠的內存來加載文件。嘗試關閉其他一切(或至少一些其他應用程序)並再次嘗試。

+1

它不是一個解決方案 –

+0

它應該是評論,而不是回答 – Lucifer

1

在getView()中,您並未重複使用convertView,而是始終用充氣器充氣新的。這需要更多的內存並使代碼更慢。另外,請檢查您是否正在使用imageLoader泄漏圖像。

+0

你可以給一些樣本 –

+0

試試這段代碼:if(convertView == null) {convertView = inflator.inflate(R.layout.griedviewrow,null);} – alders