How to use the Audio with seekbar on Recyclview android? -
i using lists of audio on recyclview , working correct means able play audio file on recyclview.
as using seekbar audio file on recyclview , problem generating when scrolling recyclview other items's of recyclview seekbar changing (seekbar using progress of audio file play.)
what want other seekbar item of recyclview sholud not change when scroll recyclview
please check code ,inside onbindviewholder recyclview , using following code, please check once.
((myaudiochat) holder).sbmyaudio.settag(position); ((myaudiochat) holder).imgplayaudio.setonclicklistener(new view.onclicklistener() { @override public void onclick(view view) { ((myaudiochat) holder).sbmyaudio.removecallbacks(null); ((myaudiochat) holder).sbmyaudio.setprogress(0); if (mediaplayer == null) { mediaplayer(); ((myaudiochat) holder).sbmyaudio.setmax(mediaplayer.getduration()); } else { mediaplayer.stop(); mediaplayer.release(); mediaplayer(); ((myaudiochat) holder).sbmyaudio.setmax(mediaplayer.getduration()); } ((myaudiochat) holder).sbmyaudio.gettag(); ((myaudiochat) holder).sbmyaudio.setmax(mediaplayer.getduration()); // set maximum range of ((myaudiochat) holder).sbmyaudio.setprogress(mediaplayer.getcurrentposition());// set current progress song's runnable moveseekbarthread = new runnable() { public void run() { if (mediaplayer.isplaying()) { int mediapos_new = mediaplayer.getcurrentposition(); int mediamax_new = mediaplayer.getduration(); ((myaudiochat) holder).sbmyaudio.setmax(mediamax_new); ((myaudiochat) holder).sbmyaudio.setprogress(mediapos_new); ((myaudiochat) holder).sbmyaudio.postdelayed(this, 100); //looping thread after 0.1 second ((myaudiochat) holder).sbmyaudio.gettag(); } } }; ((myaudiochat) holder).sbmyaudio.removecallbacks(moveseekbarthread); ((myaudiochat) holder).sbmyaudio.postdelayed(moveseekbarthread, 100); } }); i have visited following site on so did not relevant solution
1 .first link
2. second link
can use settag() , gettag() rid of problem. have used settag() on above code. please check once.
although, have asked correct seekbar updates, assuming (because haven't shard complete source) face following issues linked adapter implementation:
- how remove seekbar updater, when
mediaplayercompletes playback of audio? - how release
mediaplayerwhen activity paused? - anonymous
view.onclicklisteners ,runnables being allocated on everyonbindviewholdercall. how minimize unnecessary allocation?
you can find complete working solution here - github
following source tries fix above issues. data structures/classes assumed based on nomenclature.
public class mainactivity extends activity { private mediaplayer mediaplayer; @override protected void oncreate(@nullable bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); recyclerview rv = (recyclerview) findviewbyid(r.id.rv); rv.setlayoutmanager(new linearlayoutmanager(this)); audiochat audiochats[] = new audiochat[128]; rv.setadapter(new myadapter(arrays.aslist(audiochats))); } @override protected void onpause() { super.onpause(); if (null != mediaplayer) { mediaplayer.release(); mediaplayer = null; } } private class myadapter extends recyclerview.adapter<myadapter.myaudiochat> { private list<audiochat> audiochats; private int currentplayingposition; private seekbarupdater seekbarupdater; myadapter(list<audiochat> audiochats) { this.audiochats = audiochats; this.currentplayingposition = -1; seekbarupdater = new seekbarupdater(); } @override public myaudiochat oncreateviewholder(viewgroup parent, int viewtype) { return new myaudiochat(layoutinflater.from(parent.getcontext()).inflate(r.layout.item, parent, false)); } @override public void onbindviewholder(myaudiochat holder, int position) { if (position == currentplayingposition) { seekbarupdater.playingholder = holder; holder.sbmyaudio.post(seekbarupdater); } else { holder.sbmyaudio.removecallbacks(seekbarupdater); holder.sbmyaudio.setprogress(0); } } private class seekbarupdater implements runnable { myaudiochat playingholder; @override public void run() { if (null != mediaplayer && playingholder.getadapterposition() == currentplayingposition) { playingholder.sbmyaudio.setmax(mediaplayer.getduration()); playingholder.sbmyaudio.setprogress(mediaplayer.getcurrentposition()); playingholder.sbmyaudio.postdelayed(this, 100); } else { playingholder.sbmyaudio.removecallbacks(seekbarupdater); } } } @override public int getitemcount() { return audiochats.size(); } class myaudiochat extends recyclerview.viewholder implements view.onclicklistener { seekbar sbmyaudio; imageview imgplayaudio; myaudiochat(view itemview) { super(itemview); imgplayaudio = (imageview) itemview.findviewbyid(r.id.imgplayaudio); imgplayaudio.setonclicklistener(this); sbmyaudio = (seekbar) itemview.findviewbyid(r.id.sbmyaudio); } @override public void onclick(view v) { currentplayingposition = getadapterposition(); if (mediaplayer != null) { if (null != seekbarupdater.playingholder) { seekbarupdater.playingholder.sbmyaudio.removecallbacks(seekbarupdater); seekbarupdater.playingholder.sbmyaudio.setprogress(0); } mediaplayer.release(); } seekbarupdater.playingholder = this; startmediaplayer(); sbmyaudio.setmax(mediaplayer.getduration()); sbmyaudio.post(seekbarupdater); } } private void startmediaplayer() { mediaplayer = mediaplayer.create(getapplicationcontext(), r.raw.mp3); mediaplayer.setoncompletionlistener(new mediaplayer.oncompletionlistener() { @override public void oncompletion(mediaplayer mp) { seekbarupdater.playingholder.sbmyaudio.removecallbacks(seekbarupdater); seekbarupdater.playingholder.sbmyaudio.setprogress(0); mediaplayer.release(); mediaplayer = null; currentplayingposition = -1; } }); mediaplayer.start(); } } private class audiochat { } }
Comments
Post a Comment