android - identify items in a ListView -
i'm having troubles correct identification of items in listview.
there 4 classes matter, it's lot of code @ first i'm going explain logic of classes.
- enter
listactivity, initializelistview - execute
asynctaskdownloads json response server, parses it, populateslistviewobjects , sets adapter while showingprogressdialog - the playlistitem class includes methods data single jsonobject. used parameterize arraylist objects
- after
asynctaskdone list filled items , looks |button| artist(textview) - title(textview)
- after
update
resolved 1st issue still can't figure out what's wrong buttons
2). set onclicklistener buttons in adapter's getview() method. find out if button identified correctly did nothing changed background. click on button forces background of every 11th or 12th button changed. can't figure out far.
i can't proceed getting url , streaming audio until problems resolved, appreciated. classes go below, please ask if appears unclear.
audiolist
public class audiolist extends listactivity { private listview lv; private playlistloader loader; private audiolistadapter adapter; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_audio_list); init(); // initialize listview /*--- populate list user's audio in case network connection available ---*/ loader = new playlistloader(this, lv, adapter); if (utils.isnetworkavailable(this)) { loader.execute(); } else { app_constants.no_data_connection(this); } } @override protected void onresume() { super.onresume(); lv.setonitemclicklistener(new onitemclicklistener() { @override public void onitemclick(adapterview<?> arg0, view arg1, int arg2, long arg3) { toast.maketext(getapplicationcontext(), integer.tostring(arg2), toast.length_short).show(); } }); } private void init() { lv = getlistview(); lv.settranscriptmode(0x00000000); lv.setdividerheight(1); lv.setsmoothscrollbarenabled(true); lv.setverticalfadingedgeenabled(true); } playlistloader
public class playlistloader extends asynctask<void, void, void> { private jsonobject usersplaylist, singlejsonitem; private jsonarray responsejsonarray; private listview lv; private arraylist<playlistitem> playlist; private activity a; private playlistitem audiolist; private sharedpreferences prefs; private progressdialog pd; audiolistadapter adapter; public playlistloader(activity a, listview lv, audiolistadapter adapter) { this.lv = lv; this.a = a; this.adapter = adapter; } @override protected void doinbackground(void... arg0) { /*--- create new arraylist of playlistitem objects ---*/ playlist = new arraylist<playlistitem>(); /*--- preferences using context of calling activity ---*/ prefs = preferencemanager.getdefaultsharedpreferences(a); try { /*--- download response jsonobject server // access_token , * user_id come activity's defaultsharedpreferences ---*/ usersplaylist = utils.retrievejsonobjectfromurl(new url( app_constants.request_audio_list(prefs)), a); /*--- response array received object ---*/ responsejsonarray = usersplaylist.getjsonarray("response"); /*--- populate arraylist objects response array ---*/ (int = 0; < responsejsonarray.length(); i++) { singlejsonitem = responsejsonarray.getjsonobject(i); audiolist = new playlistitem(singlejsonitem); playlist.add(audiolist); } } catch (malformedurlexception e) { e.printstacktrace(); } catch (jsonexception e) { e.printstacktrace(); } catch (ioexception e) { e.printstacktrace(); } return null; } @override protected void onpreexecute() { super.onpreexecute(); pd = new progressdialog(a); pd.settitle("please wait"); pd.setmessage("retrieving audio list..."); pd.show(); } @override protected void onpostexecute(void result) { super.onpostexecute(result); lv.setvisibility(view.visible); pd.dismiss(); /*--- set adapter passed in constructor adapter passed listview ---*/ adapter = new audiolistadapter(a, r.layout.playlist_item, playlist); lv.setadapter(adapter); } } audiolistadapter
public class audiolistadapter extends arrayadapter<playlistitem> { private playlistitem pl; private context context; private int layoutresourceid; private playlistitem aud; private arraylist<playlistitem> data = null; public audiolistadapter(context context, int layoutresourceid, arraylist<playlistitem> data) { super(context, layoutresourceid, data); this.layoutresourceid = layoutresourceid; this.context = context; this.data = data; } @override public playlistitem getitem(int position) { return super.getitem(position); } @override public int getcount() { return data.size(); } @override public int getposition(playlistitem item) { return super.getposition(item); } @override public view getview(int position, view convertview, viewgroup parent) { pl = new playlistitem(); aud = getitem(position); if (convertview == null) { layoutinflater inflater = ((activity) context).getlayoutinflater(); convertview = inflater.inflate(layoutresourceid, parent, false); pl.btnplay = (button) convertview.findviewbyid(r.id.btn_list_play); pl.imgsaved = (imageview) convertview .findviewbyid(r.id.img_list_audio_saved); pl.tvartist = (textview) convertview .findviewbyid(r.id.tvlistitemartist); pl.tvtitle = (textview) convertview .findviewbyid(r.id.tvlistitemsong); convertview.settag(pl); } else { pl = (playlistitem) convertview.gettag(); pl.btnplay.setbackgroundresource(r.drawable.list_button_play); } pl.tvartist.settext(aud.getartist() + " " + "-"); pl.tvtitle.settext(aud.gettitle()); pl.btnplay.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { /*--- vibrate if option enabled in preferences ---*/ if (app_constants.ishapticfeedbackenabled(getcontext())) { app_constants.dovibrate(getcontext()); } pl.btnplay.setbackgroundresource(r.drawable.list_button_pause); } }); return convertview; } playlistitem
public class playlistitem { private string artist, title; private jsonobject obj; public button btnplay; public textview tvartist, tvtitle; public imageview imgsaved; public int duration; public int audio_id; public string url; /*--- constructor takes single jsonobject response array ---*/ public playlistitem(jsonobject obj) { this.obj = obj; } public playlistitem() { // default constructor } /*--- methods below return values key passed jsonobject ---*/ public string getartist() { try { artist = obj.getstring("artist"); } catch (jsonexception e) { e.printstacktrace(); } return artist; } public string gettitle() { try { title = obj.getstring("title"); } catch (jsonexception e) { e.printstacktrace(); } return title; } public int getid() { try { audio_id = obj.getint("aid"); } catch (jsonexception e) { e.printstacktrace(); } return audio_id; } public string geturl() { try { url = obj.getstring("url"); } catch (jsonexception e) { e.printstacktrace(); } return url; } }
edit:
try this
take custom selector in drawable button_play.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/pause_button" android:state_selected="true" /> <item android:drawable="@drawable/play_button" /> </selector> modifty adapter this
public class audiolistadapter extends arrayadapter<playlistitem> { private playlistitem pl; private context context; private int layoutresourceid; private playlistitem aud; private arraylist<playlistitem> data = null; button previous; public audiolistadapter(context context, int layoutresourceid, arraylist<playlistitem> data) { super(context, layoutresourceid, data); this.layoutresourceid = layoutresourceid; previous=new button(context); this.context = context; this.data = data; } .... .... @override public view getview(int position, view convertview, viewgroup parent) { pl = new playlistitem(); aud = getitem(position); if (convertview == null) { layoutinflater inflater = ((activity) context).getlayoutinflater(); convertview = inflater.inflate(layoutresourceid, parent, false); pl.btnplay = (button) convertview.findviewbyid(r.id.btn_list_play); pl.btnplay.setbackgroundresouce(r.drawable.button_play); //you can set here or in xml pl.imgsaved = (imageview) convertview .findviewbyid(r.id.img_list_audio_saved); pl.tvartist = (textview) convertview .findviewbyid(r.id.tvlistitemartist); pl.tvtitle = (textview) convertview .findviewbyid(r.id.tvlistitemsong); convertview.settag(pl); } else { pl = (playlistitem) convertview.gettag(); } pl.tvartist.settext(aud.getartist() + " " + "-"); pl.tvtitle.settext(aud.gettitle()); pl.btnplay.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { /*--- vibrate if option enabled in preferences ---*/ if (app_constants.ishapticfeedbackenabled(getcontext())) { app_constants.dovibrate(getcontext()); } //for reason, background gets changed every 11th or 12th button in list button current=((button)v); current.setselected(true); previous.setselected(false); previous=current; } }); return convertview; } } the reason why button , listitem not clickable because list have focus item button, need setfocusable=false button. try setting focusable=false button in xml. if not worked this
in row xml file
1.set focusable=true button. 2.in same set android:descendantfocusability="blocksdescendants" parent item.(i.e parent layout in views lie).
in getview() method after setting onclicklistener button, set focusable false button. work sure. hope you..
Comments
Post a Comment