- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
编辑
我在 Github
上创建了一个演示项目来展示确切的问题。 Git Project .
我在 Kotlin
中编写了一个可扩展的 recyclerView
每行都有一个使用 TextToSpeech
的播放按钮。播放按钮的文本应在播放时更改为停止,然后在播放结束时更改回播放。
当我在 setOnUtteranceProgressListener
的 onStart
和 onDone
中调用 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/
在从事 TextToSpeech 项目时,我遇到了以下情况: 如果我使用 speak(CharSequence text, int queueMode, Bundle params, String u
我有一个问题,我想在 Text to speech 完成讲话后启动 android 服务。 这是我的代码 HashMap myHashAlarm = new HashMap(); my
编辑 我在 Github 上创建了一个演示项目来展示确切的问题。 Git Project . 我在 Kotlin 中编写了一个可扩展的 recyclerView 每行都有一个使用 TextToSpee
在我的主 Fragment 中,我实现了 TextToSpeech mainFragment extends Fragment implements TextToSpeech.OnInitListen
我希望 setOnUtteranceProgressListener 应该在语音完成后通知一个 Toast。它似乎不起作用。我使用了 setOnUtteranceProgressListener 并且
我是一名优秀的程序员,十分优秀!