Пожалуйста, проверьте это.В вашем коде вы пропустили UtteranceProgressListener
.Вы должны добавить UtteranceProgressListener
, который даст вам события слушателя завершения речи.Кроме того, вам понадобится utteranceID, который будет передан tts.speak()
, который поможет вам определить речь, если вам это нужно.Возьмите переменную как
String utterId = "";
, затем в вашем TextToSpeech
onInit
перед вызовом convertTextToSpeech
зарегистрируйте этого слушателя в своих tts.
...
else{
tts.setOnUtteranceProgressListener(new UtteranceProgressListener() {
@Override
public void onStart(String utteranceId) {
}
@Override
public void onDone(String utteranceId) {
convertTextToSpeech(position);
}
@Override
public void onError(String utteranceId) {
}
});
convertTextToSpeech(0);
}
Первоначально 0 передается на convertTextToSpeech
, поскольку это первый вызов.Здесь я внес некоторые изменения в convertTextToSpeech
.В этом я удалил цикл, который вы использовали ранее вместо этого, это будет рекурсивная функция.
public void convertTextToSpeech(int pos) {
if (pos >= items.size()) return;
position = pos;
final Multiples multiples = items.get(position);
text = multiples.first + " " + multiples.getSecond() + " Za " + multiples.getResult() + ".";
utterId = (new Random().nextInt() % 9999999) + ""; // "" is String force
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Bundle params = new Bundle();
params.putString(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, utterId);
tts.speak(text, TextToSpeech.QUEUE_FLUSH, params, utterId);
} else {
HashMap<String, String> params = new HashMap<>();
params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, utterId);
tts.speak(text, TextToSpeech.QUEUE_FLUSH, params);
}
runOnUiThread(new Runnable() {
@Override
public void run() {
MyAdapter m = (MyAdapter) mAdapter;
multiples.setImage_show(true);
m.updateItem(multiples, position);
position++;
}
});
}
Как вы можете видеть, tts.speak()
устарел, вы должны использовать новый, чтобы избежать проблемв последней версии Android.
В вашем MyAdapter
вы должны установить предыдущий элемент image_show
в false.
public void updateItem(Multiples newItem, int pos) {
if (pos > 0) {
items.get(pos - 1).setImage_show(false);
}
Log.i("values", "-----In updateItem Log----Row value-" + newItem.getFirst() + " X " + newItem.getSecond() + ", Position=" + pos);
items.set(pos, newItem); //update passed value in your adapter's data structure
Log.e("msg", "-----items.get(pos)------------->" + items.get(pos).getFirst() + " X " + items.get(pos).getSecond());
notifyDataSetChanged();
}
Проверьте загруженный GIF.Пожалуйста, держите нас в курсе.
Если вам нужна помощь, вы можете попросить.Спасибо