Редактировать
Я создал демонстрационный проект на Github
, показывающий точную проблему. Git Project .
Я написал расширяемый recyclerView
в Kotlin
В каждой строке есть кнопка воспроизведения, которая использует TextToSpeech
. Текст кнопки воспроизведения должен измениться, чтобы остановить ее во время воспроизведения, а затем вернуться к воспроизведению после ее завершения.
Когда я вызываю notifyItemChanged
в пределах onStart
и onDone
из setOnUtteranceProgressListener
, onBindViewHolder
не вызывается, и строки в представлении recycler больше не будут расширяться и сворачиваться правильно.
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)
}
}
Как я могу вызвать notifyItemChanged(position)
из setOnUtteranceProgressListener
или какой обратный вызов я могу использовать, чтобы notifyItemChanged выполнялся только тогда, когда это безопасно для выполнения?