Kotlin:RecyclerView出现SoundPool运行时错误

问题描述 投票:0回答:1

我在SecondAdapter类中遇到运行时错误:No Value passed for parameter 'soundToInit'。我的SecondAdapter是SecondActivity中声明的RecyclerView的适配器。

SecondAdapter类:

class SecondAdapter(val content:Array<String>) : RecyclerView.Adapter<SecondCustomViewGolder>(){

    //var lessons = arrayOf("Satu", "Dua", "Tiga", "Empat", "Lima", "Enam", "Tujuh",
      //  "Lapan", "Sembilan")

    var soundList = arrayOf(R.raw.sound1, R.raw.sound2,R.raw.sound1, R.raw.sound2,
        R.raw.sound1, R.raw.sound2,R.raw.sound1, R.raw.sound2,
        R.raw.sound1)

    override fun getItemCount(): Int {
        return content.size
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SecondCustomViewGolder {
        var layoutInflater = LayoutInflater.from(parent.context)
        var cellForRow = layoutInflater.inflate(R.layout.lesson_row, parent, false)
        return SecondCustomViewGolder(cellForRow)
    }

    override fun onBindViewHolder(holder: SecondCustomViewGolder, position: Int) {
        var soundToLoad = SoundEngine()
        holder.soundToInit = soundToLoad.load(SecondViewActivity(), soundList.get(position), 1)
    }
}
class SecondCustomViewGolder(var viewTwo : View, var soundToInit:Int) : RecyclerView.ViewHolder(viewTwo){
    init {
        var soundToPlay = SoundEngine()
        soundToPlay.play(soundToInit, 1F, 1F,1,0, 1F)
}
}

SoundEngine:

class SoundEngine {

    private var soundPool: SoundPool

    init {
        soundPool = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            val audioAttributes = AudioAttributes.Builder()
                .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                .setUsage(AudioAttributes.USAGE_GAME)
                .build()
            SoundPool.Builder()
                .setMaxStreams(1)
                .setAudioAttributes(audioAttributes)
                .build()
        } else {
            SoundPool(1, AudioManager.STREAM_MUSIC, 0)
        }
    }


    fun load(context: Context, rawId: Int, priority: Int):Int {
        return soundPool.load(context, rawId, priority)
    }

    fun play(soundID: Int, leftVolume: Float, rightVolume: Float, priority: Int, loop: Int, rate: Float) {
        soundPool.play(soundID, leftVolume, rightVolume, priority, loop, rate)
    }
}

请给我一些提示...在此先感谢...

android android-studio kotlin
1个回答
0
投票

如下更改您的持有人

class SecondCustomViewGolder(var viewTwo : View) : RecyclerView.ViewHolder(viewTwo) {

    private var soundEngine = SoundEngine()

    fun loadAndPlaySound(soundIdToPlay:Int, priority: Int) {
        val soundToPlay = soundEngine.load(viewTwo.context, soundIdToPlay, priority)
        soundEngine.play(soundToPlay, 1F, 1F, 1, 0, 1F)
    }
}

并按如下方式调用它:

override fun onBindViewHolder(holder: SecondCustomViewGolder, position: Int) {
    holder.loadAndPlaySound(soundList.get(position), 1)
}
© www.soinside.com 2019 - 2024. All rights reserved.