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

Popular posts from this blog

c# - SharpSVN - How to get the previous revision? -

c++ - Is it possible to compile a VST on linux? -

url - Querystring manipulation of email Address in PHP -