android - OutOfMemory Exception in gridview -


basically have gridview, in show products (from 10 or 20 1k+ items) each item has couple of custom textviews, , imageview.

i use viewholder pattern , picasso library load images asynchronously. have no problem showing items, speed or whatsoever, think it's safe getview function works quite nice, although have 1 major problem scrolling gridview, , down, memory monitor shows increase of course increment rate depends on item-view contents when commented image loading part example, rate decreased.

what guess somehow generated views staying in memory , prevents them getting collected gc. although sometimes, when scroll gc comes , collects , memory gets free, scrolling fast result in oom, sooner or later.

my main question if have memory leak or not?! since gc works (slow scrlling), , lets app crashes oom exception.

and hope find out problem , every little bit of appreciated in advance.

xml of fragment-layout hosts gridview:

<gridview       android:id="@+id/gv_main"       android:layout_width="fill_parent"       android:layout_height="fill_parent"       android:layout_marginleft="2dp"       android:layout_marginright="2dp"       android:animationcache="false"       android:clickable="true"       android:descendantfocusability="beforedescendants"       android:gravity="center"       android:scrollingcache="false"       android:verticalspacing="10dp"       /> 

my adapter(this extends cursoradapter, although have same problem whit baseadapter well):

public class shyguninventorygridcursoradapter extends cursoradapter {      private context mcontext;      private cursor cursor;     private int numcolumns;     private int listitemid, listitemnoimageid, griditemid;     private string[] type;     private string[] columntitle;     private int[] viewid;     private string texttemp;     private cybersetting cybersetting;     private string unitdesc = "";     private boolean ismain;     private int size;     private layoutinflater inflater;     private int thumbsize = 200;      private file pic;      private tpicturecatalog picturecatalog;     private tproductcatalog productcatalog;       //private viewgroup hostactivity;     //int idtemp;      private layoutinflater cursorinflater;        public shyguninventorygridcursoradapter(context context, cursor c, int flags) {         super(context, c, flags);         this.mcontext = context;         cursorinflater = (layoutinflater) context.getsystemservice(                 context.layout_inflater_service);         //this.cursor = c;         productcatalog=tproductcatalog.getinstance();         cybersetting=cybersetting.getinstance();     }         @override     public view newview(context context, cursor cursor, viewgroup parent) {          view view = cursorinflater.inflate( r.layout.listview_inventory_product_griditems, parent, false);          viewholder holder = new viewholder();         holder.tvattachment = (imageview) view.findviewbyid(r.id.iv_inventory_products_griditems_attachment);         holder.imagecount = (textview) view.findviewbyid(r.id.imagecount);         holder.tvitemcode = (textview) view.findviewbyid(r.id.tv_inventory_products_griditems_itemcode);         holder.tvproductname = (textview) view.findviewbyid(r.id.tv_inventory_products_griditems_title);         holder.tvprice = (rialtextview) view.findviewbyid(r.id.tv_inventory_products_griditems_price);         holder.tvremain = (textview) view.findviewbyid( r.id.tv_inventory_products_griditems_remain);         holder.btnmore =(com.rey.material.widget.button) view.findviewbyid(r.id.btn_inventory_products_griditems_more);         holder.btnplus = (com.rey.material.widget.button) view.findviewbyid(r.id.btn_inventory_products_griditems_addone);          view.settag(holder);         log.d("curad","newview");         return view;     }       @override     public void bindview(view view, context context, cursor cursor) {         log.d("curad","bindview");          viewholder holder;           holder = (viewholder) view.gettag();              holder.itemid = cursor.getstring(cursor.getcolumnindex(databasecolumncontent.col_product_item_id.tostring()));         tsimpleproduct tempproduct = productcatalog.getsimpleproductbyid(integer.parseint(holder.itemid));         holder.itemguid = cursor.getstring(cursor.getcolumnindex(databasecolumncontent.col_product_guid.tostring()));         holder.tvitemcode.settext(cursor.getstring(cursor.getcolumnindex(databasecolumncontent.col_product_itemcode.tostring())));         holder.tvproductname.settext(cursor.getstring(cursor.getcolumnindex(databasecolumncontent.col_product_itemdesc.tostring())));          //remain         if (cybersetting.getsettingvalue(tcybersettingkey.showitemremain).equals("1")) {             texttemp = (mcontext.getstring(r.string.restrictedinfo));         } else {             if (tempproduct.getdefaultunitvalue() == 2 && tempproduct.isunitdependent()) {                 string titleremain2 = databasecolumncontent.col_product_cursor_remain2.tostring();                 texttemp = cursor.getstring(cursor.getcolumnindex(titleremain2));             }             if (cybersetting.getsettingvalue(tcybersettingkey.showitemremain).equals("2")) {                 if (texttemp == null) {                     texttemp = "0";                 }                 int t = integer.parseint(texttemp);                 if (t > 0) {                     texttemp = mcontext.getstring(r.string.productavailable);                 } else {                     texttemp = mcontext.getstring(r.string.productunavailable);                 }             }         }         holder.tvremain.settext(texttemp);          //price         string pricelevel = "0";         try {             register register = register.getinstance();             pricelevel = register.getpricelevel();         } catch (nodaosetexception e) {             e.printstacktrace();         }         if(!pricelevel.equals("0"))             texttemp = cursor.getstring(cursor.getcolumnindex(pricelevel));         else             texttemp = "0.0";          if (tempproduct.getdefaultunitvalue() == 2 && tempproduct.isunitdependent()) {             double price2;             price2 = tlineitem.convertprice1toprice2(double.parsedouble(texttemp), tempproduct.isunit1bigger(), tempproduct.getunitcoef());             texttemp = tgeneraltools.convertdoubletoenglishstring(price2);             if (tempproduct.getunitdesc2() != null && !tempproduct.getunitdesc2().equals(""))                 unitdesc = " (" + tempproduct.getcompleteunitdesc2() + ")";         } else {             if (tempproduct.getunitdesc1() != null && !tempproduct.getunitdesc1().equals(""))                 unitdesc = " (" + tempproduct.getcompleteunitdesc1() + ")";         }         holder.pricedef = texttemp;         holder.tvprice.settext(texttemp + unitdesc);          holder.tvremain.settext(holder.tvremain.gettext() + unitdesc);           //image         picturecatalog = tpicturecatalog.getinstance();         string defguid = "";          if (tempproduct.gethasattachcontent() >= 1 && picturecatalog.isdownloadedalbumavailable()) {             defguid = picturecatalog.getdefaultpictureguid(holder.itemguid);             if (tempproduct.gethasattachcontent() == 1) {                 holder.imagecount.setvisibility(view.gone);             } else {                 holder.imagecount.setvisibility(view.visible);                 holder.imagecount.settext(string.valueof(tempproduct.gethasattachcontent()));             }         } else {             holder.imagecount.setvisibility(view.gone);         }          string filename = environment.getexternalstoragedirectory().getpath()                 + fileaddresscontent.application_home_directory                 + fileaddresscontent.pictures_root_directory                 //+ fileaddresscontent.pictures_thumbs_directory.tostring()                 + defguid + fileaddresscontent.pictures_extension;         pic = new file(filename);         if (pic.exists())             picasso.with(mcontext)                     .load(pic)                     .error(r.drawable.noimage)                             //.placeholder(r.drawable.loading)                     .resize(thumbsize, thumbsize)                     .centerinside()                     .into(holder.tvattachment);         else             picasso.with(mcontext)                     .load(r.drawable.noimage)                     .resize(thumbsize, thumbsize)                     .centerinside()                     .into(holder.tvattachment);         holder.tvattachment.setminimumheight(thumbsize);            setupgridview(view, holder);       }        private void setupgridview(view view, final viewholder holder) {         /*final imageview iv = (imageview) view.findviewbyid(r.id.iv_inventory_products_griditems_attachment);         com.rey.material.widget.button btmore = (com.rey.material.widget.button) view.findviewbyid(r.id.btn_inventory_products_griditems_more);         com.rey.material.widget.button btplus = (com.rey.material.widget.button) view.findviewbyid(r.id.btn_inventory_products_griditems_addone); //final textview tvtitle = (textview) view.findviewbyid(r.id.tv_inventory_products_griditems_title);         final rialtextview tvprice = (rialtextview) view.findviewbyid(r.id.tv_inventory_products_griditems_price);         final textview tvitemid = (textview) view.findviewbyid(r.id.tv_inventory_products_griditems_itemid);         final textview tvguid = (textview) view.findviewbyid(r.id.tv_inventory_products_griditems_guid);         //final textview tvremain = (textview) view.findviewbyid(r.id.tv_inventory_products_griditems_remain);*/           holder.tvattachment.setonclicklistener(new view.onclicklistener() {             @override             public void onclick(view v) {                         /* bitmapdrawable bitmapdrawable = ((bitmapdrawable) iv.getdrawable());*/                 showimagedialog(holder.itemguid);              }         });          holder.btnmore.setonclicklistener(new view.onclicklistener() {             @override             public void onclick(view v) {                         /*addtoinvoicedialog(tvtitle.gettext().tostring(), tvprice.gettext().tostring(), tvitemid.gettext().tostring(),                                             tvremain.gettext().tostring(),iv.getdrawable(),tvguid.gettext().tostring());*/                 showaddtoinvoicefragment(holder.itemid, holder.pricedef);             }         });          holder.btnplus.setonclicklistener(new view.onclicklistener() {             @override             public void onclick(view view) {                 //inventoryfragment.addtoinvoice(holder.itemid, 1, holder.pricedef, null, null);             }         });      }        public object getitem(int position) {         return position;     }      public long getitemid(int position) {         return position;     }      private void showimagedialog(string referenceguid) {          //inventoryfragment.openalbum(referenceguid);      }      private void showaddtoinvoicefragment(string itemid, string pricedef) {         //inventoryfragment.showaddtoinvoicefragment(itemid, pricedef);     }   } 

this part in java code set adapter:

shyguninventorygridcursoradapter listadapter1 = new shyguninventorygridcursoradapter(context,cursor, cursoradapter.flag_register_content_observer);                 gridview.setnumcolumns(colcount);                 gridview.setadapter(listadapter1); 

mat screen( not reach anywhere here, mean non of roots or ... own code)

mat mat2

not mention, adding system.gc() @ end of get view method in adapter solve everything, i'm sure it's not right thing do


Comments