修改
我已经在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仅在安全执行的情况下执行?
答案 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)
}
}
}