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 mediaplayer completes playback of audio?
  • how release mediaplayer when activity paused?
  • anonymous view.onclicklisteners , runnables being allocated on every onbindviewholder call. 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

Popular posts from this blog

Sort a complex associative array in PHP -

vb.net - How to ignore if a cell is empty nothing -

recursion - Can every recursive algorithm be improved with dynamic programming? -