android - TextView in custom GridView adapter does not update, but ImageView does -
i have custom gridview adapter takes audiogriditem object parameter in constructor. each object has 2 imageviews , 1 textview. when delete grid position, using long click listener, should erase file (on sd card) put placeholder drawable in place of previous image (uri). should set textview empty string. not work. imageviews update, textview title of file still lingers in old spot. results in in arraylist moving spot, yet titles of file still in old spot. yet, curiously, when switch photo tab, return audio tab, textview updates (but won't update when switch video or write tab, strange.)
i clear both adapter , arraylist before reload (re-run asynctask).
i have seen other posts on here problem, have not found works me. this 1 talks using right textview, have one, , using right. said, other code involving textview incorrect? it's thing can think of since use notifydatasetchanged() on place, know adapter updated (plus imageviews change, that's hint). logic using in long click listener to:
delete file @ position on sd card
clear both adapter , list (then call
notifydatasetchanged())reload sd card scratch calling
asynctaskagain
any ideas? can see in photo, highlighted icons ones have sound file , drawable attached imageviews (which play correctly), darker icons ones placeholders, , file tried long click delete, shows placeholder icon (as should) lingering title in textview. how rid of this?

audiotab.java
package org.azurespot.cutecollection.audiotab; import android.app.alertdialog; import android.app.progressdialog; import android.content.dialoginterface; import android.graphics.drawable.drawable; import android.media.mediaplayer; import android.net.uri; import android.os.asynctask; import android.os.bundle; import android.os.environment; import android.support.v4.app.fragment; import android.util.log; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; import android.widget.adapterview; import android.widget.gridview; import org.azurespot.r; import java.io.file; import java.io.ioexception; import java.util.arraylist; /** * created mizu on 2/8/15. */ public class audiotab extends fragment { private gridview gridview; private gridviewaudioadapter audioadapter; private progressdialog progressdialog; private string[] numbersdcardfiles = null; file[] files; arraylist<audiogriditem> audiofiles = new arraylist<>(); audiogriditem audiogriditem; audiogriditem drawable; audiogriditem drawablesound; mediaplayer mp; uri drawableoff; string audiotitle; public audiotab(){ super(); } @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { // inflate layout fragment view v = inflater.inflate(r.layout.audio_tab, container, false); mp = new mediaplayer(); // instantiate progress dialog progressdialog = new progressdialog(getactivity()); // fragments, make sure include rootview when finding id gridview = (gridview) v.findviewbyid(r.id.audio_grid); // create custom adapter object audioadapter = new gridviewaudioadapter(getactivity(), audiofiles); // set adapter gridview gridview.setadapter(audioadapter); if(audioadapter.getcount() == 0) { // load contents of sd card through asynctask new audiodownloadertask().execute(); } setupgridviewlistener(); return v; } private class audiodownloadertask extends asynctask<object, void, audiogriditem> { @override protected void onpreexecute() { super.onpreexecute(); progressdialog.setmessage("loading cute collection ..."); //set progress bar cancelable on button progressdialog.setcancelable(true); progressdialog.show(); } @override protected audiogriditem doinbackground(object... params) { retrieveaudio(); return null; } @override protected void onpostexecute(audiogriditem result) { progressdialog.dismiss(); // add sound off drawable replace song files when there none (int = 0; < (15 - numbersdcardfiles.length); i++) { audioadapter.add(drawable); } audioadapter.notifydatasetchanged(); } } public void retrieveaudio() { // creates new audiogriditem object drawable source drawablesound = new audiogriditem(null, getresources().getdrawable (r.drawable.ic_sounds_placeholder_on), null); try { // gets directory cute videos sd card file cutevideosdir = new file(environment.getexternalstoragepublicdirectory (environment.directory_podcasts), "cute sounds"); // puts list files array files = cutevideosdir.listfiles(); // number of files in cute sounds directory numbersdcardfiles = new string[files.length]; (file singlefile : files) { // both audio file , audio title uri audiouri = uri.fromfile(singlefile); audiotitle = singlefile.getname(); // sound on drawable object drawable drawableon = drawablesound.getdrawable(); // since in loop, sound on drawable added same files audiogriditem = new audiogriditem(audiouri, drawableon, audiotitle); // add uri, drawable (sound on) , title arraylist audiofiles.add(audiogriditem); } // put sound off drawable audiogriditem object (as uri, no drawable or string) drawableoff = uri.parse("android.resource://org.azurespot/drawable/" + r.drawable.ic_sounds_placeholder); drawable = new audiogriditem(drawableoff, null, null); } catch (exception e) { e.printstacktrace(); } } private void setupgridviewlistener() { gridview.setonitemclicklistener(new adapterview.onitemclicklistener() { @override public void onitemclick(adapterview<?> adapterview, view item, int pos, long id) { audiogriditem currentitem = audioadapter.getitem(pos); mp.setoncompletionlistener(new mediaplayer.oncompletionlistener(){ public void oncompletion(mediaplayer mediaplayer){ mediaplayer.reset(); } }); if(!(audioadapter.getitem(pos).equals(drawable))) { if(currentitem == audioadapter.getitem(pos)) { if (mp.isplaying()) { mp.reset(); } else { uri soundfile = (audioadapter.getitem(pos)).getaudio(); try { mp.setdatasource(getactivity(), soundfile); mp.prepare(); mp.start(); } catch (ioexception e) { e.printstacktrace(); } } } else{ uri soundfile = (audioadapter.getitem(pos)).getaudio(); try { mp.setdatasource(getactivity(), soundfile); mp.prepare(); mp.start(); } catch (ioexception e) { e.printstacktrace(); } } } } }); // delete uri item gridview.setonitemlongclicklistener(new adapterview.onitemlongclicklistener() { @override public boolean onitemlongclick(adapterview<?> aview, view item, final int pos, long id) { mp.reset(); // insures placeholder drawable not clickable if (!(audioadapter.getitem(pos)).equals(drawable)) { new alertdialog.builder(getactivity()) .settitle("delete") .setmessage("delete cute sound?") .setpositivebutton(android.r.string.yes, new dialoginterface.onclicklistener() { public void onclick(dialoginterface dialog, int which) { // delete arraylist first audiofiles.remove(pos); // file name delete sd card string name = files[pos].getname(); file file = new file(environment.getexternalstoragepublicdirectory (environment.directory_podcasts), "cute sounds" + "/" + name); file.delete(); audiogriditem.setaudiotitle(" "); // after each item delete, replace default icon, , empty string audioadapter.add(new audiogriditem(drawableoff, null, null)); // clear old list first audioadapter.clear(); audiofiles.clear(); audioadapter.notifydatasetchanged(); // reload files, positioning right when open new audiodownloadertask().execute(); log.d("tag", "reached after async runs again."); } }) .setnegativebutton(android.r.string.no, new dialoginterface.onclicklistener() { public void onclick(dialoginterface dialog, int which) { // nothing dialog.cancel(); } }) .seticon(android.r.drawable.ic_dialog_alert) .show(); } return true; } }); } } gridviewaudioadapter.java
package org.azurespot.cutecollection.audiotab; import android.content.context; import android.graphics.drawable.drawable; import android.net.uri; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; import android.widget.arrayadapter; import android.widget.framelayout; import android.widget.imageview; import android.widget.textview; import org.apache.commons.io.filenameutils; import org.azurespot.r; import java.util.arraylist; /** * created mizu on 2/8/15. */ public class gridviewaudioadapter extends arrayadapter<audiogriditem> { private textview audiotitleview; int position; viewholder holder = null; context context; string rootname; public gridviewaudioadapter(context context, arraylist<audiogriditem> audio) { super(context, 0, audio); this.context = context; } @override public view getview(int position, view itemview, viewgroup parent) { this.position = position; if (itemview == null) { itemview = layoutinflater.from(getcontext()) .inflate(r.layout.audio_tab_item, parent, false); holder = new viewholder(); holder.audioviewfile = (imageview) itemview.findviewbyid(r.id.audio_file); holder.audioviewicon = (imageview) itemview.findviewbyid(r.id.audio_icon); audiotitleview = (textview) itemview.findviewbyid(r.id.audio_title); // stores holder view itemview.settag(holder); } else { holder = (viewholder)itemview.gettag(); } // position of item clicked in gridview final audiogriditem audiogriditem = getitem(position); if (audiogriditem != null) { // getting uri here might give file or off drawable uri audiouri = audiogriditem.getaudio(); // ever on drawable drawable drawableon = audiogriditem.getdrawable(); // set text string audiotitle = audiogriditem.getaudiotitle(); if (audiotitle != null) { rootname = filenameutils.removeextension(audiotitle); audiotitleview.settext(rootname); } else audiotitleview.settext(" "); // set uri or drawable imageview slots holder.audioviewfile.setimageuri(audiouri); holder.audioviewicon.setimagedrawable(drawableon); // positioning file uri in gridview slot holder.audioviewfile.setscaletype(imageview.scaletype.center_crop); holder.audioviewfile.setlayoutparams(new framelayout.layoutparams (220, 220)); // positioning drawable icon in gridview slot holder.audioviewicon.setscaletype(imageview.scaletype.center_crop); holder.audioviewicon.setlayoutparams(new framelayout.layoutparams (220, 220)); } return itemview; } public class viewholder{ imageview audioviewfile; imageview audioviewicon; } } audiogriditem.java
package org.azurespot.cutecollection.audiotab; import android.graphics.drawable.drawable; import android.net.uri; /** * created mizu on 4/26/15. */ public class audiogriditem { private uri audio; private string audiotitle; drawable drawableon; public audiogriditem(uri audio, drawable drawable, string autotitle) { super(); this.audio = audio; this.drawableon = drawable; this.audiotitle = autotitle; } public uri getaudio() { return audio; } public void setaudio(uri audio){ this.audio = audio; } public drawable getdrawable(){ return drawableon; } public void setdrawable(drawable drawable){ this.drawableon = drawable; } public string getaudiotitle(){ return audiotitle; } public void setaudiotitle(string audiotitle){ this.audiotitle = audiotitle; } }
hmm check out
in gridviewaudioadapter.java
public class gridviewaudioadapter extends arrayadapter<audiogriditem> { private textview audiotitleview; // @ madam int position; in getview method
holder = new viewholder(); holder.audioviewfile = (imageview)itemview.findviewbyid(r.id.audio_file); holder.audioviewicon = (imageview)itemview.findviewbyid(r.id.audio_icon); audiotitleview = (textview)itemview.findviewbyid(r.id.audio_title); i not have explanation assembling thoughts, difference is, imageviews ok not textview looking @ getview put textview declaration in viewholder getview this
holder = new viewholder(); holder.audioviewfile = (imageview)itemview.findviewbyid(r.id.audio_file); holder.audioviewicon = (imageview)itemview.findviewbyid(r.id.audio_icon); holder.audiotitleview=(textview)itemview.findviewbyid(r.id.audio_title); try , see if helps
Comments
Post a Comment