ご提示されたコードが一部のため, 想像でコードを修正してみました.
単一の PlayerManager インスタンスを必要な個所で使用している他, play/stop 時には PlayerManager.PlayerListener によって通知し, SoundAdapter はそれを受けて行の特定・notify(再表示) しています.
SoundAdapter は過去のご質問のコードから拝借しています.
SoundData の m_sound の型が分からなかったので, Uri としました.
Globals による context の取得も, 普通に上位からの指定にしました.
コードを切り貼りしただけで, 動作は確認していません
MainActivity(一部)
java
1 final PlayerManager playerManager = new PlayerManager(this);
2
3 List<SoundData> alarmList = new ArrayList<>(); //データの設定は省略
4 SoundAdapter alarmAdapter = new SoundAdapter(this, playerManager, alarmList);
5 //alarmAdapter は alarmFragment の RecyclerView に設定
6
7 List<SoundData> musicList = new ArrayList<>(); //データの設定は省略
8 SoundAdapter musicAdapter = new SoundAdapter(this, playerManager, musicList);
9 //musicAdapter は musicFragment の RecyclerView に設定
10
11 //ビューページャータブ切替判定
12 viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
13 //ビューページャータブ選択判定
14 @Override
15 public void onPageSelected(int position) {
16 //ミュージックプレイヤー解放
17 try {
18 playerManager.stop();
19 } catch (IOException e) {
20 e.printStackTrace();
21 }
22 }
23 });
SoundAdapter(一部想像)
java
1//サウンドリサイクルビューアダプター
2public class SoundAdapter extends RecyclerView.Adapter<SoundAdapter.ItemViewHolder> implements PlayerManager.PlayerListener {
3 //使途不明
4 private boolean onBind;
5 int alarmType;
6 String alarmSound;
7 String musicSound;
8 int alarmPosition;
9 int musicPosition;
10 int chekPosition;
11 int playPosition;
12
13 private PlayerManager playerManager;
14 private List<SoundData> soundList;
15
16 @Override
17 public void onPlay(Uri sound) {
18 int index = search(sound);
19 if(index >= 0) notifyItemChanged(index);
20 }
21 @Override
22 public void onStop(Uri sound) {
23 int index = search(sound);
24 if(index >= 0) notifyItemChanged(index);
25 }
26 private int search(Uri sound) {
27 for(int i=0; i<soundList.size(); i++) if(soundList.get(i).m_sound.equals(sound)) return i;
28 return -1;
29 }
30
31 static class ItemViewHolder extends RecyclerView.ViewHolder {
32 LinearLayout row_layout;
33 RadioButton rb_sound;
34 TextView t_sound_name;
35 TextView t_play;
36 ItemViewHolder(View v){
37 super(v);
38 row_layout = (LinearLayout)v.findViewById(R.id.row_layout);
39 rb_sound = (RadioButton) v.findViewById(R.id.rb_sound);
40 t_sound_name = (TextView)v.findViewById(R.id.t_sound_name);
41 t_play = (TextView)v.findViewById(R.id.t_play);
42 }
43 }
44
45 SoundAdapter(Context context, PlayerManager playerManager, List<SoundData> soundList){
46 this.playerManager = playerManager;
47 this.soundList = soundList;
48
49 //設定画面初期値設定
50 SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
51
52 //アラームタイプ取得
53 alarmType = sharedPreferences.getInt("alarmType", 0);
54 //アラーム音取得
55 alarmSound = sharedPreferences.getString("alarmSound", "");
56 //ミュージック音取得
57 musicSound = sharedPreferences.getString("musicSound", "");
58 //アラームポジション取得
59 alarmPosition = sharedPreferences.getInt("alarmPosition", 0);
60 //ミュージックポジション取得
61 musicPosition = sharedPreferences.getInt("musicPosition", 0);
62
63 playerManager.addPlayerListener(this);
64 }
65
66 @Override
67 public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
68 View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.sound_row, parent, false);
69 return new ItemViewHolder(v);
70 }
71
72 @Override
73 public void onBindViewHolder(final ItemViewHolder holder, final int position) {
74 onBind = true;
75
76 //行の値設定
77 holder.rb_sound.setChecked(soundList.get(position).m_rb_sound);
78 holder.t_sound_name.setText(soundList.get(position).m_t_sound_name);
79
80 //再生ボタン設定
81 if(soundList.get(position).m_sound.equals(playerManager.getLastPlayedSound())){
82 holder.t_play.setText(R.string.playStop_name);
83 }else{
84 holder.t_play.setText(R.string.play_name);
85 }
86
87 //再生ボタンクリック
88 holder.t_play.setOnClickListener(new View.OnClickListener() {
89 @Override
90 public void onClick(View v) {
91 //アラームタイプ判定
92 if(alarmType == 0){
93 chekPosition = alarmPosition;
94 }else{
95 chekPosition = musicPosition;
96 }
97 //再生、停止処理
98 try {
99 if(soundList.get(position).m_sound.equals(playerManager.getLastPlayedSound())) {
100 playerManager.stop();
101 } else {
102 playerManager.play(soundList.get(position).m_sound);
103 }
104 } catch (IOException e) {
105 e.printStackTrace();
106 }
107 //再生ポジション設定
108 playPosition = position;
109 }
110 });
111
112 onBind = false;
113 }
114
115 @Override
116 public int getItemCount() {
117 return soundList.size();
118 }
119}
PlayerManager
java
1public class PlayerManager {
2 private Context context;
3 private MediaPlayer mediaPlayer;
4 private AudioManager audioManager;
5 private AudioManager.OnAudioFocusChangeListener afChangeListener;
6
7 private Uri lastPlayedSound;
8
9 interface PlayerListener {
10 void onPlay(Uri path);
11 void onStop(Uri path);
12 }
13 private List<PlayerListener> playerListenerList = new ArrayList<>();
14
15 public void addPlayerListener(PlayerListener l) {
16 playerListenerList.add(l);
17 }
18 public void removePlayerListener(PlayerListener l) {
19 playerListenerList.remove(l);
20 }
21 protected void firePlay(Uri path) {
22 for(PlayerListener l : playerListenerList) l.onPlay(path);
23 }
24 protected void fireStop(Uri path) {
25 for(PlayerListener l : playerListenerList) l.onStop(path);
26 }
27
28 public PlayerManager(Context context) {
29 this.context = context;
30
31 // AudioManagerを取得する
32 audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
33
34 //オーディオフォーカスのコールバック
35 afChangeListener = new AudioManager.OnAudioFocusChangeListener() {
36 public void onAudioFocusChange(int focusChange) {
37 //フォーカスを完全に失ったら
38 if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
39 } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT) {//一時的なフォーカスロスト
40 } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) {//通知音とかによるフォーカスロスト(ボリュームを下げて再生し続けるべき)
41 } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {//フォーカスを再度得た場合
42 }
43 }
44 };
45 }
46
47 //再生処理
48 public void play(Uri sound) throws IOException {
49 if(sound == null) throw new IllegalArgumentException();
50 if (mediaPlayer != null) stop();
51
52 // 現在のメディア音量を表示する
53 // 現在の音量を取得する
54 int ringVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
55 // 音量を設定する
56 audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, ringVolume, AudioManager.FLAG_SHOW_UI);
57
58 // フォーカスを排他的に奪う(他のアプリの音楽を停止)
59 audioManager.requestAudioFocus(afChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE);
60
61 mediaPlayer = new MediaPlayer();
62
63 //アラーム音設定
64 mediaPlayer.setDataSource(context, sound); // 音声を設定
65 mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); // ミュージックボリュームで再生
66 mediaPlayer.setLooping(true); // ループ再生を設定
67 mediaPlayer.prepare(); // 音声を読み込み
68
69 //アラーム音再生
70 mediaPlayer.start(); // 再生
71
72 lastPlayedSound = sound;
73 firePlay(sound);
74 }
75
76 //停止処理
77 public void stop() throws IOException {
78 if(mediaPlayer == null) return;
79
80 // フォーカスを明け渡す(他のアプリの音楽停止を解除)
81 audioManager.abandonAudioFocus(afChangeListener);
82
83 // アラーム音が再生されていれば停止する
84 if (mediaPlayer.isPlaying()) {
85 mediaPlayer.stop(); // 停止
86 }
87
88 // メディアプレイヤー を解放する
89 mediaPlayer.reset();
90 mediaPlayer.release();
91 mediaPlayer = null;
92
93 Uri sound = lastPlayedSound;
94 lastPlayedSound = null;
95 fireStop(sound);
96 }
97
98 public Uri getLastPlayedSound() {
99 return lastPlayedSound;
100 }
101}