java - 在 setOnUtteranceProgressListener 中调用时 notifyItemChanged() 不起作用

标签 java android kotlin android-recyclerview

编辑

我在 Github 上创建了一个演示项目来展示确切的问题。 Git Project .


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

当我在 setOnUtteranceProgressListeneronStartonDone 中调用 notifyItemChanged 时,onBindViewHolder不会被调用,recyclerView 中的行将不再正确展开和折叠。

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)
//                    }
        })
    }
})

onBindViewHolder:

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)
    }
}

我如何从 setOnUtteranceProgressListener 中调用 notifyItemChanged(position) 或者我可以使用什么回调以便 notifyItemChanged 仅在安全执行时执行?

最佳答案

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

这对我有用,对你也应该有用:

使用 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)
        }
    }
}

关于java - 在 setOnUtteranceProgressListener 中调用时 notifyItemChanged() 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55061747/

相关文章:

java - 如何在运行时在 Java 中更改方法名称?

java - 从 Spring Security 访问 Spring MVC 服务

android - 程序类型已经存在 : com. unity3d.player.BuildConfig

android - Lateinit 属性适配器尚未初始化设置 RecyclerView 和 Fragment

java - Kotlin 中 for 循环的 IndexOutOfBoundsException

java - 玩家签名互动

java - 在 JTable 中选择列时将标题文本设为粗体

android - 带有 Pinned Header 的自定义 ListView,在设置 padding 时导致 Jank

android - 每次更换计算机时,我都需要向 Facebook 应用程序设置添加新的 key 哈希吗?

java - Kotlin - 作为尾随 Lambda 的接口(interface)