gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:07:44 27 4
gpt4 key购买 nike

编辑

我在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com