'When i click on multiple buttons, multiple audios start playing at the same time in android studio

When i click on multiple images of recyclerview then multiple audios start playing without stopping the previous one. It is getting irritating. I hope someone can help me fix this. I have read about singleton class and using only one instance of media player but couldn't understood how to implement it correctly.

class RecylerViewAdapter (var context: Context, var arrayList: ArrayList<ItemModel>) :
    RecyclerView.Adapter<RecylerViewAdapter.ItemHolder>() {

    var mediaPlayer: MediaPlayer? = null

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemHolder {

        val viewHolder = LayoutInflater.from(parent.context)
            .inflate(R.layout.sound_item_list, parent, false)
        return ItemHolder(viewHolder)

    }

    override fun onBindViewHolder(holder: ItemHolder, position: Int) {

        val itemModel: ItemModel = arrayList[position]

        holder.soundImage.setImageResource(itemModel.soundImage)
        holder.soundTitle.text = itemModel.soundTitle

        mediaPlayer = MediaPlayer.create(context, itemModel.soundTrack)
        mediaPlayer!!.isLooping = true

        holder.soundImage.setOnClickListener {
            Toast.makeText(context, itemModel.soundTitle, Toast.LENGTH_LONG).show()
            mediaPlayer!!.start()
        }

    }


    override fun getItemCount(): Int {

        return arrayList.size

    }

    class ItemHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

        var soundImage = itemView.soundImage
        var soundTitle = itemView.soundTitle

    }


}


Solution 1:[1]

Code seems to be good. Remember to call release() on your player and initialise it again with new media file before playing it. Maybe it could be useful for you to implement a MediaPlayer.OnCompletionListener in which you could call player.release()

Or maybe this is enough:

holder.soundImage.setOnClickListener {
        mediaPlayer!!.release()
        mediaPlayer = null
        mediaPlayer = MediaPlayer.create(context, itemModel.soundTrack)
        Toast.makeText(context, itemModel.soundTitle, Toast.LENGTH_LONG).show()
        mediaPlayer!!.start()
    }

Solution 2:[2]

I'll recommend to initialize just single object of MediaPlayer in your fragment or activity in which your RecyclerView is located and than pass that object into adapter as a parameter and use it and dont forget to release MediaPlayer in onDestroy() of activity or onDestroyView() of fragment by calling MediaPlayer?.release(). In adapter OnClickListener() you have to stop the media player calling MediaPlayer?.stop() and MediaPlayer?.reset() and than add the new source

class RecylerViewAdapter (var context: Context, var arrayList: ArrayList<ItemModel>, var mediaPlayer : MediaPlayer?) :
RecyclerView.Adapter<RecylerViewAdapter.ItemHolder>() {

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ItemHolder {

    val viewHolder = LayoutInflater.from(parent.context)
        .inflate(R.layout.sound_item_list, parent, false)
    return ItemHolder(viewHolder)

}

override fun onBindViewHolder(holder: ItemHolder, position: Int) {

    val itemModel: ItemModel = arrayList[position]

    holder.soundImage.setImageResource(itemModel.soundImage)
    holder.soundTitle.text = itemModel.soundTitle


    holder.soundImage.setOnClickListener {
    mediaPlayer?.stop()
    mediaPlayer?.reset()
    mediaPlayer?.setDataSource(itemModel.soundTrack)
    mediaPlayer?.isLooping = true
    mediaPlayer?.start()
    }

}


override fun getItemCount(): Int {

    return arrayList.size

}

class ItemHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

    var soundImage = itemView.soundImage
    var soundTitle = itemView.soundTitle

}

}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Marcel Hofgesang
Solution 2 BeeDeveloper