Friday 15 May 2015

android - correctly displays a seekbar in custom adapter -



android - correctly displays a seekbar in custom adapter -

i have list in each element on player. when click on "start" , song starts playing strip seekbar starts moving. when click on "stop" song stops playing , strip stops. if while moving strip scroll list , goes off screen, starts move strip on same position in visible area of screen.

public class recordadapter extends baseadapter { private mediaplayer mediaplayer; private layoutinflater inflater; private arraylist<recordbean> recordbeans; private final handler handler = new handler(); private context ctx; private int global_position; ... @override public view getview(final int position, view convertview, viewgroup parent) { view view = convertview; final viewholder holder; if (convertview == null) { view = inflater.inflate(r.layout.recorditem, parent, false); holder = new viewholder(); holder.date = (textview) view.findviewbyid(r.id.recordate); holder.seekbar = (seekbar) view.findviewbyid(r.id.seekbar); holder.start = (button) view.findviewbyid(r.id.btnstart); holder.stop = (button) view.findviewbyid(r.id.btnstop); view.settag(holder); } else { holder = (viewholder) view.gettag(); } holder.date.settext(" " + recordbeans.get(position).getdate()); holder.start.settag(position); holder.stop.settag(position); holder.seekbar.settag(position); holder.seekbar.setonseekbarchangelistener(new seekbar.onseekbarchangelistener() { @override public void onprogresschanged(final seekbar seekbar, final int i, boolean b) { if (b && (integer)seekbar.gettag()==global_position) { mediaplayer.seekto(i); } } @override public void onstarttrackingtouch(seekbar seekbar) { } @override public void onstoptrackingtouch(seekbar seekbar) { } }); holder.start.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { releasemp(); seek { mediaplayer = new mediaplayer(); mediaplayer.setdatasource(recordbeans.get((integer) v.gettag()).getfile()); mediaplayer.setaudiostreamtype(audiomanager.stream_music); mediaplayer.setonpreparedlistener(new mediaplayer.onpreparedlistener() { @override public void onprepared(mediaplayer mediaplayer) { mediaplayer.start(); global_position = position; holder.start.settextcolor(color.red); holder.seekbar.setmax(mediaplayer.getduration()); startplayprogressupdater(holder.seekbar,holder.start); } }); mediaplayer.prepareasync(); } grab (ioexception e) { e.printstacktrace(); } if (mediaplayer == null) { return; } mediaplayer.setoncompletionlistener(new mediaplayer.oncompletionlistener() { @override public void oncompletion(mediaplayer mediaplayer) { log.d("log_tag", "oncompletion"); holder.start.settextcolor(color.white); } }); } }); holder.stop.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { if (mediaplayer == null) return; if ((integer) v.gettag() == global_position) { mediaplayer.stop(); } } }); homecoming view; } private void releasemp() { if (mediaplayer != null) { seek { mediaplayer.release(); mediaplayer = null; } grab (exception e) { e.printstacktrace(); } } } private static class viewholder { textview date; seekbar seekbar; button start; button stop; } public void startplayprogressupdater(final seekbar seek, final button start) { seek.setprogress(mediaplayer.getcurrentposition()); if (mediaplayer.isplaying()) { runnable notification = new runnable() { public void run() { startplayprogressupdater(seek,start); } }; handler.postdelayed(notification, 1000); } else { mediaplayer.pause(); seek.setprogress(0); } } }

edit:

i added geter , seter in recordbean

public int getseekpos() { homecoming seekpos; } public void setseekpos(int seekpos) { seekpos = seekpos; }

and

holder.seekbar.setprogress(recordbeans.get(position).getseekpos()); holder.date.settext(" " + recordbeans.get(position).getdate());

and

@override public void onprogresschanged(final seekbar seekbar, final int i, boolean b) { if (b && (integer)seekbar.gettag()==global_position) { // mediaplayer.seekto(i); recordbeans.get(position).setseekpos(i); } }

but think left in code

the list item beingness recycled when leaves screen. seek phone call in getview:

holder.seekbar.clearfocus();

android

No comments:

Post a Comment