android - Using Custom Adapter uses more RAM? -
my application on first lunch uses 6.5mb, , when enter activity 3 tabs, tab displays listview, uses 14 mb!!
this happened when went "bad code" simpleadapter custom adapter.
what want 2 strings on each side in listview. strings in array, here way using people told me incorrect way do:
string[] array= getresources().getstringarray(r.array.names_list); int lengthtmp= array.length; for(int i=0;i<lengthtmp;i++) { counter++; addtolist(array[i]); } adapter = new simpleadapter(this,list,r.layout.start_row,new string[] {"number","suraname"},new int[] {r.id.start_numbering,r.id.start_name}); private void addtolist(string name) { hashmap<string,string> temp = new hashmap<string,string>(); temp.put("number", integer.tostring(sortingpictures[counter-1])); temp.put("suraname", name); list.add(temp); }
with code, activity takes 10mb of ram. after changing code use custom adapter, uses 14 mb:
public class listview_start_adapter extends baseadapter{ private string[] suranames; private int[] pagenumber; private context mcontext; relativelayout relativeview; textview tv_suraname; textview tv_pagenumber; relativelayout.layoutparams param; public listview_start_adapter(context context, string[] suranames, int[] pagenumber){ mcontext=context; this.suranames=suranames; this.pagenumber=pagenumber; } @override public int getcount() { // todo auto-generated method stub return suranames.length; } @override public object getitem(int arg0) { // todo auto-generated method stub return suranames[arg0]; } @override public long getitemid(int arg0) { // todo auto-generated method stub return pagenumber[arg0]; } @override public view getview(int position, view convertview, viewgroup parent) { // todo auto-generated method stub relativeview= new relativelayout(mcontext); tv_suraname = new textview(mcontext); tv_pagenumber = new textview(mcontext); tv_suraname.settext(suranames[position]); tv_pagenumber.settext(integer.tostring(pagenumber[position])); param = new relativelayout.layoutparams(relativelayout.layoutparams.fill_parent, relativelayout.layoutparams.fill_parent); param.addrule(relativelayout.align_parent_right); relativeview.addview(tv_suraname, param); relativeview.addview(tv_pagenumber); return relativeview; } }
can tell me why ram used when using custom adapter? there wrong custom adapter?
edit1: better code 1 suggested dziobas:
@override public view getview(int position, view convertview, viewgroup parent) { viewholder holder; if(convertview == null) { convertview = minflater.inflate(r.layout.start_row, parent,false); holder=new viewholder(); holder.tv_suraname =(textview)convertview.findviewbyid(r.id.start_name); holder.tv_pagenumber = (textview)convertview.findviewbyid(r.id.start_numbering); convertview.settag(holder); } else { holder = (viewholder) convertview.gettag(); } holder.tv_suraname.settext(suranames[position]); holder.tv_pagenumber.settext(integer.tostring(pagenumber[position])); return convertview; }
i exceptionnullpointer in line: " convertview = minflater.inflate(r.layout.start_row, parent,false); " why?
you're not recycling view in getview.
it'll better this:
public class listview_start_adapter extends baseadapter { private string[] suranames; private int[] pagenumber; relativelayout.layoutparams param; context mcontext; public listview_start_adapter(context context, string[] suranames, int[] pagenumber) { mcontext = context; this.suranames = suranames; this.pagenumber = pagenumber; param = new relativelayout.layoutparams(relativelayout.layoutparams.fill_parent, relativelayout.layoutparams.fill_parent); param.addrule(relativelayout.align_parent_right); } @override public int getcount() { return suranames.length; } @override public object getitem(int arg0) { return suranames[arg0]; } @override public long getitemid(int arg0) { return pagenumber[arg0]; } @override public view getview(int position, view convertview, viewgroup parent) { viewholder holder; relativelayout rowview; if(convertview == null) { //create view rowview = new relativelayout(mcontext); holder = new viewholder(); holder.tv_suraname = new textview(mcontext); holder.tv_pagenumber = new textview(mcontext); rowview.addview(holder.tv_suraname, param); rowview.addview(holder.tv_pagenumber); rowview.settag(holder); } else { //recycle view rowview = (relativelayout) convertview; holder = (viewholder) convertview.gettag(); } //fill views holder.tv_suraname.settext(suranames[position]); holder.tv_pagenumber.settext(integer.tostring(pagenumber[position])); return rowview; } class viewholder { relativelayout relativeview; textview tv_suraname; textview tv_pagenumber; } }
and change view creation. use layoutinflater , use xml layout.
see this presentation more info listview adapter efficiency.
Comments
Post a Comment