android - Loading image in onCreate doesn't fill adapter correctly -


my application able take pictures , save , show them in list. can deleted , list correctly updated. however, if close application , launch again, list no more correct. in detail:

these list elements in adapter after take 2 pictures:

list[0] 20150603_042556  list[1] 20150603_042601 

these pictures correctly saved. however, if close , open again application, happens:

loaded selfie:﹕ 20150603_042556 list[0] 20150603_042556            loaded selfie: 20150603_042601 list[0] 20150603_042601            list[1] 20150603_042601 

this add function:

public void add(selfierecord listitem) {     list.add(listitem);     for(int k=0;k<list.size();k++)         log.i("list: ", string.valueof(k) + " " + list.get(k).getpicname());     notifydatasetchanged(); } 

this how load saved pictures:

for (int ii = 0; ii < dirfiles.length; ii++) {     file file = dirfiles[ii];     string path = file.getabsolutepath();     selfie.setpic(path);     selfie.setpicname(path.substring(path.indexof("_") + 1, path.lastindexof("_")));     log.i(tag+" loaded selfie: ",path);     madapter.add(selfie); } 

can't figure out happens.

edit: more code follows.

in main activity:

protected void oncreate(bundle savedinstancestate) {         super.oncreate(savedinstancestate);         setcontentview(r.layout.activity_main);          // setup notifications         setnotifications();          mlistview = (listview)findviewbyid(r.id.selfielist);         mlistview.setonitemclicklistener(new adapterview.onitemclicklistener() {             @override             public void onitemclick(adapterview<?> parent, view view, int position, long id) {                 intent intent = new intent(mainactivity.this, viewactivity.class);                 selfierecord record = (selfierecord) madapter.getitem(position);                 intent.putextra(selfie_key, record.getpic());                 startactivity(intent);             }         });          madapter = new selfieadapter(getapplicationcontext());         mlistview.setadapter(madapter);          // load selfies         if (environment.media_mounted.equals(environment.getexternalstoragestate()) && madapter.getcount()==0) {             // gets files in directory             file filedirectory = new file(getexternalfilesdir(environment.directory_pictures).getabsolutepath());             if (!filedirectory.exists()) {                 filedirectory.mkdirs();             }             // lists files array             file[] dirfiles = filedirectory.listfiles();              if (dirfiles.length != 0) {                 selfierecord selfie = new selfierecord();                 // loops through array of files, outputing name console                 (int ii = 0; ii < dirfiles.length; ii++) {                     file file = dirfiles[ii];                     string path = file.getabsolutepath();                     selfie.setpic(path);                     selfie.setpicname(path.substring(path.indexof("_") + 1, path.lastindexof("_")));                     log.i(tag+" loaded selfie: ",path);                     madapter.add(selfie);                 }             }         }          registerforcontextmenu(mlistview);      } 

in adapter:

@override     public view getview(int position, view convertview, viewgroup parent) {          view newview = convertview;         viewholder holder;          selfierecord curr = list.get(position);         log.i("list: ", string.valueof(position)+" "+list.get(position).getpicname());          if (null == convertview) {             holder = new viewholder();             newview = inflater.inflate(r.layout.list_record, parent, false);             holder.pic = (imageview) newview.findviewbyid(r.id.pic);             holder.name = (textview) newview.findviewbyid(r.id.pic_name);             newview.settag(holder);          } else {             holder = (viewholder) newview.gettag();         }          //setpic(holder.pic, curr.getpic());         holder.name.settext(curr.getpicname());         mimageview = holder.pic;         new bitmaploader().execute(curr.getpic());          log.i("loader: ", string.valueof(position) + " " + curr.getpicname());          return newview;     }      static class viewholder {          imageview pic;         textview name;      }      public void add(selfierecord listitem) {         list.add(listitem);         for(int k=0;k<list.size();k++)             log.i("list: ", string.valueof(k) + " " + list.get(k).getpicname());         notifydatasetchanged();     }      public void remove(int position) {         list.remove(position);         notifydatasetchanged();     } 

bitmap loader:

public class bitmaploader extends asynctask<string,integer,bitmap> {          @override         protected bitmap doinbackground(string... resid) {              // dimensions of view             int targetw = math.round(typedvalue.applydimension(typedvalue.complex_unit_dip, 160, mcontext.getresources().getdisplaymetrics()));             int targeth = math.round(typedvalue.applydimension(typedvalue.complex_unit_dip, 120, mcontext.getresources().getdisplaymetrics()));              // dimensions of bitmap             bitmapfactory.options bmoptions = new bitmapfactory.options();             bmoptions.injustdecodebounds = true;             bitmapfactory.decodefile(resid[0], bmoptions);             int photow = bmoptions.outwidth;             int photoh = bmoptions.outheight;              // determine how scale down image             int scalefactor = math.min(photow/targetw, photoh/targeth);              // decode image file bitmap sized fill view             bmoptions.injustdecodebounds = false;             bmoptions.insamplesize = scalefactor;             bmoptions.inpurgeable = true;              bitmap bitmap = bitmapfactory.decodefile(resid[0], bmoptions);              return bitmap;          }          @override         protected void onpostexecute(bitmap result) {             mimageview.setimagebitmap(result);         }      } 

i believe problem when put elements in adapter after recovered them storage:

loaded selfie:﹕ 20150603_042556 list[0] 20150603_042556            loaded selfie: 20150603_042601 list[0] 20150603_042601            list[1] 20150603_042601 

the second call adapter's add method overwrite first element. why?

solved changing loop in on create:

if (dirfiles.length != 0) {                 // loops through array of files, outputing name console                 (int ii = 0; ii < dirfiles.length; ii++) {                     file file = dirfiles[ii];                     string path = file.getabsolutepath();                     selfierecord selfie = new selfierecord();                     selfie.setpic(path);                     selfie.setpicname(path.substring(path.indexof("_") + 1, path.lastindexof("_")));                     log.i(tag+" loaded selfie: ",path);                     madapter.add(selfie);                 }             } 

must pass different selfierecord object add method.


Comments