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
Post a Comment