Search code examples
adapterandroid-arrayadapterandroid-recyclerviewandroid-adapter

Problem With Change Before Play Icon When Playing Next Music In The RecyclerView


im new to android developing. i have two list of musics that i can completely getting and playing and changing that's icon from play to pause or etc. but i have a major problem with my before playing item. for resolving this problem i was searching all of my past day and today and reading a lot codes to find best condition for changing.

Main Trouble: when im clicking for the first on play_btn , my music starting to play. its OK. when im clicking on play_btn playing music , it change icon to pause and its music will stop; truble when im clicking on next recycler row . my past btn_play icon dont changing.

viewHolder.btn_play.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View view) {

    if (oldPosition == -1) {
      if (!isMediaPlayerPlaying) {
        mediaPlayer = new MediaPlayer();
        switch (listName) {
          case "sabah": {
            mediaPlayer = MediaPlayer.create(G.app, sabahMusics.get(position));
            break;
          }
          case "masae": {
            mediaPlayer = MediaPlayer.create(G.app, masaeMusics.get(position));
            break;
          }
        }
        Log.i("hdev", "boolean is: " + isMediaPlayerPlaying);
        mediaPlayer.start();
        isMediaPlayerPlaying = !isMediaPlayerPlaying;
        oldPosition = position;
      } else {
        mediaPlayer.pause();
        isMediaPlayerPlaying = !isMediaPlayerPlaying;
      }
    }
    if (oldPosition != position) {

    }

      if (mediaPlayer.isPlaying()) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
          viewHolder.btn_play.setBackground(G.app.getDrawable(R.drawable.pause));
        }
      } else {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
          viewHolder.btn_play.setBackground(G.app.getDrawable(R.drawable.play));
        }
      }

      mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mediaPlayer) {
          Log.i("hdev", "Prepaired Prepaired Prepaired");
        }
      });
      mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mediaPlayer) {
          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            viewHolder.btn_play.setBackground(G.app.getDrawable(R.drawable.play));
          }
        }
      });

  }
});

Solution

  • im answerd this question with limitting my users:

    viewHolder.btn_play.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
        takeView = view;
        if (oldPosition == -1 || oldPosition == position) {
          if (!isMediaPlayerPlaying) {
            mediaPlayer = new MediaPlayer();
            switch (listName) {
              case "sabah": {
                mediaPlayer = MediaPlayer.create(G.app, sabahMusics.get(position));
                break;
              }
              case "masae": {
                mediaPlayer = MediaPlayer.create(G.app, masaeMusics.get(position));
                break;
              }
            }
            Log.i("hdev", "boolean is: " + isMediaPlayerPlaying);
            mediaPlayer.start();
            isMediaPlayerPlaying = !isMediaPlayerPlaying;
            oldPosition = position;
          } else {
            mediaPlayer.pause();
            oldPosition = -1;
            isMediaPlayerPlaying = !isMediaPlayerPlaying;
          }
          if (mediaPlayer.isPlaying()) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
              viewHolder.btn_play.setBackground(G.app.getDrawable(R.drawable.pause));
            }
          } else {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
              viewHolder.btn_play.setBackground(G.app.getDrawable(R.drawable.play));
            }
          }
          mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mediaPlayer) {
              Log.i("hdev", "Prepaired Prepaired Prepaired");
            }
          });
          mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mediaPlayer) {
              if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                viewHolder.btn_play.setBackground(G.app.getDrawable(R.drawable.play));
              }
            }
          });
        } else  {
          MediaPlayer waterMediaPlayer = new MediaPlayer();
          waterMediaPlayer = new MediaPlayer();
          waterMediaPlayer = MediaPlayer.create(G.app, R.raw.water);
          waterMediaPlayer.start();
          animateShake(viewHolder.btn_play);
          Snackbar.make(view.getRootView() ,"Something to show Err for user", 2000).show();
    
        }
      }
    });