0

J'utilise les listes de l'audio sur mon Recyclview et il travaille des moyens corrects, je suis capable de lire le fichier audio sur mon Recyclview.Comment utiliser l'audio avec seekbar sur Recyclview android?

Comme je suis en utilisant le Seekbar avec mon fichier audio sur mon Recyclview, le problème génère que lorsque je suis défilement du Recyclview l'autre items's of Recyclview Seekbar est en train de changer (Seekbar j'utilise pour le progrès du jeu de fichiers audio.)

ce que je veux que d'autres Seekbar élément de Recyclview sholud ne pas être changement wh en i défiler la Recyclview

S'il vous plaît vérifier mon code, à l'intérieur du onBindViewHolder pour mon Recyclview, je suis en utilisant le code suivant, s'il vous plaît vérifier une fois.

((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 the Maximum range of the 
        ((MyAudioChat) holder).sbMyAudio.setProgress(mediaPlayer.getCurrentPosition());// set current progress to 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 the thread after 0.1 second 
           ((MyAudioChat) holder).sbMyAudio.getTag(); 
          } 

         } 
        }; 

        ((MyAudioChat) holder).sbMyAudio.removeCallbacks(moveSeekBarThread); 
        ((MyAudioChat) holder).sbMyAudio.postDelayed(moveSeekBarThread, 100); 

       } 
      }); 

J'ai visité le site suivant sur SO mais n'a pas obtenu la solution pertinente
1 .First Link
2. Second Link

Peut-on utiliser le setTag() et getTag() pour se débarrasser de de ce problème. Je l'ai utilisé le setTag() sur mon code ci-dessus. S'il vous plaît vérifier une fois.

+0

S'il vous plaît aidez-moi à court de ce problème –

Répondre

1

Bien que, vous avez demandé seulement corriger les SeekBar mises à jour, je suppose (parce que vous ne l'avez pas shard source complet) que vous ferez face à bientôt les questions suivantes qui sont liées à la mise en œuvre Adapter:

  • Comment supprimer le programme de mise à jour seekBar lorsque MediaPlayer termine la lecture de l'audio?
  • Comment libérer le MediaPlayer lorsque l'activité est en pause?
  • anonymes View.OnClickListener s et Runnable sont alloués sur chaqueonBindViewHolder appel. Comment puis-je minimiser leur allocation inutile?

Vous pouvez trouver la solution de travail complète ici - GitHub

Après la source essaie de résoudre tous les problèmes ci-dessus. Certaines structures/classes de données sont supposées basées sur votre 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 { 

    } 
} 
+0

Merci pour urs solution ... Vous le ferez savoir demain ..Comme je l'ai bloqué sur les autres tâches..I = Ma principale préoccupation est que lorsque je fais défiler la recyclview (quand mon audio joue avec seekbar) que d'autres éléments (Seekbar) mise à jour aussi ... Est-ce que ça recouvre toutes les choses? –

+0

@RavindraKushwaha Oui, ça couvre ça. Raison de votre problème, RecyclerView réutilise les vues. Par conséquent, vos écouteurs de mise à jour mettent également à jour les vues indésirables. – kujeensiti

+0

Plus +1 pour l'effort urs..Vera vérifier demain et laissez-vous savoir –