在setOnUtteranceProgressListener中调用notifyItemChanged()不起作用

时间:2019-03-08 10:56:39

标签: java android kotlin android-recyclerview

修改

我已经在Github上创建了一个演示项目,显示了确切的问题。 Git Project


我在recyclerView中写了一个可扩展的Kotlin,每一行都有一个使用TextToSpeech的播放按钮。播放按钮的文字应更改为在播放时停止播放,然后在播放结束时更改为播放。

当我在notifyItemChanged的{​​{1}}和onStart中调用onDone时,setOnUtteranceProgressListener不会被调用,并且recyclerView中的行将不再展开和折叠正确。

onBindViewHolder

onBindViewHolder:

t1 = TextToSpeech(context, TextToSpeech.OnInitListener { status ->
    if (status != TextToSpeech.ERROR) {
        t1?.setOnUtteranceProgressListener(object : UtteranceProgressListener() {
            override fun onStart(utteranceId: String?) {
                recyclerView.adapter.notifyItemChanged(position)
            }

            override fun onStop(utteranceId: String?, interrupted: Boolean) {
                    super.onStop(utteranceId, interrupted)
                    onDone(utteranceId)
            }

            override fun onDone(utteranceId: String?) {
                val temp = position
                position = -1
                recyclerView.adapter.notifyItemChanged(temp)
            }

            override fun onError(utteranceId: String?) {}
//                    override fun onError(utteranceId: String?, errorCode: Int) {
//                        super.onError(utteranceId, errorCode)
//                    }
        })
    }
})

如何在override fun onBindViewHolder(holder: RabbanaDuasViewHolder, position: Int){ if (Values.playingPos == position) { holder.cmdPlay.text = context.getString(R.string.stop_icon) } else { holder.cmdPlay.text = context.getString(R.string.play_icon) } } 中调用notifyItemChanged(position)或使用什么回调,以便notifyItemChanged仅在安全执行的情况下执行?

1 个答案:

答案 0 :(得分:4)

我试图复制您的问题,但我知道它不起作用,因为未在主线程上调用UtteranceProgressListener方法,这就是为什么未调用适配器的onBindViewHolder方法的原因。 / p>

这对您有用,也应该对您有用:

使用runOnUiThread{}方法在RecyclerView上执行以下操作:

t1.setOnUtteranceProgressListener(object : UtteranceProgressListener() {
    override fun onError(utteranceId: String?) {
    }

    override fun onStart(utteranceId: String?) {
        runOnUiThread {
            recyclerView.adapter?.notifyItemChanged(position)
        }
    }

    override fun onStop(utteranceId: String?, interrupted: Boolean) {
        super.onStop(utteranceId, interrupted)
        onDone(utteranceId)
    }

    override fun onDone(utteranceId: String?) {
        val temp = position
        position = -1
        runOnUiThread {
            recyclerView.adapter?.notifyItemChanged(temp)
        }
    }
}