Probleme mit Spieltasten -Symbole im Cardview -Adapter in Android Studio (mit Kotlin) haben
Posted: 21 May 2025, 15:02
Ich habe nur ein paar Wochen Android Studio gelernt, also bitte vergib mir diesen Beitrag (durchsuchtes Web und fragte Chat -GPT, aber es war mir nicht viel Hilfe). Sie spielen Sound so, wie ich es möchte, aber ich kann nicht so ändern, dass die Spiel-/Stopp-Symbole ordnungsgemäß funktionieren, ohne "benachrichtigenDataSchanged () zu verwenden. Bit. Adapter, der das Spielen/Stop -Symbole entsprechend an meinen MP3 -Dateien geändert hat, um zu spielen.
Code: Select all
package com.example.prototype1
import android.media.MediaPlayer
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageButton
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
class CardAdapter(private val cardList: List) :
RecyclerView.Adapter() {
private var sharedMediaPlayer: MediaPlayer? = null
private var currentlyPlayingPosition: Int? = null
private var isPlaying = false
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CardViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.card_design, parent, false)
return CardViewHolder(view)
}
override fun onBindViewHolder(holder: CardViewHolder, position: Int) {
holder.bind(cardList[position], position)
}
override fun getItemCount(): Int = cardList.size
override fun onViewRecycled(holder: CardViewHolder) {
super.onViewRecycled(holder)
if (holder.adapterPosition == currentlyPlayingPosition) {
releaseMediaPlayer()
}
}
private fun releaseMediaPlayer() {
sharedMediaPlayer?.release()
sharedMediaPlayer = null
isPlaying = false
val oldPosition = currentlyPlayingPosition
currentlyPlayingPosition = null
oldPosition?.let { notifyItemChanged(it) }
}
inner class CardViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
private val cardTitle: TextView = itemView.findViewById(R.id.textViewPolski)
private val cardDescription: TextView = itemView.findViewById(R.id.textViewIslandzki)
private val playButton: ImageButton = itemView.findViewById(R.id.buttonPlay)
fun bind(cardItem: CardItem, position: Int) {
cardTitle.text = cardItem.textPolish
cardDescription.text = cardItem.textIcelandic
// Set icon according to playing state
if (position == currentlyPlayingPosition && isPlaying) {
playButton.setImageResource(android.R.drawable.ic_media_pause)
} else {
playButton.setImageResource(android.R.drawable.ic_media_play)
}
playButton.setOnClickListener {
val isThisCurrentlyPlaying = (position == currentlyPlayingPosition)
if (isThisCurrentlyPlaying && isPlaying) {
// Stop current
sharedMediaPlayer?.stop()
releaseMediaPlayer()
notifyDataSetChanged()
} else {
// Stop existing playback
sharedMediaPlayer?.stop()
sharedMediaPlayer?.release()
// Start new playback
sharedMediaPlayer = MediaPlayer.create(itemView.context, cardItem.audioResourceId)
sharedMediaPlayer?.start()
isPlaying = true
currentlyPlayingPosition = position
sharedMediaPlayer?.setOnCompletionListener {
releaseMediaPlayer()
notifyDataSetChanged()
}
notifyDataSetChanged() // refresh all buttons
}
}
}
}
}