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)

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