无法与 TTS 同步在 recyclerVIew 中显示 imageView [英] Unable to Show imageView in recyclerVIew synchronously with TTS
问题描述
如何在 recyclerView 中显示/隐藏 imageView 作为 TTS(文本到语音)播放所有可用的列表项,一个接一个!
How can i show/Hide imageView in recyclerView as TTS(text to speech) plays for all the available list items, one by one!
活动方法- 这个方法被称为 r with Loop(不工作,没有错误,但只是不给我预期的输出
Activity method -This method is called r with Loop(not working, no bugs but simply do not give my expected output
int position=0;
public void convertTextToSpeech() {
Multiples multiples1=items.get(position);
for (Multiples item : items) {
text = item.first + " " + item.getSecond() + " Za " + item.getResult() + ".";
tts.speak(text, TextToSpeech.QUEUE_ADD, null);
boolean speakingEnd = tts.isSpeaking();
if (speakingEnd) {
Toast.makeText(getApplicationContext(), "Speaking...."+position, Toast.LENGTH_SHORT).show();
multiples1.setImage_show(true);
mAdapter.notifyItemChanged(position);
} else {
Toast.makeText(getApplicationContext(), "Done...."+position, Toast.LENGTH_SHORT).show();
}
position++;
}
}
完整代码如下,方便大家理解,
The complete code is below for more understanding,
首先,我在 recyclerView 中显示所有项目.之后,我在具有 for 循环的方法中调用显示的项目以 TTS 播放每一行(列表项).我现在面临的问题是 imageView 没有显示,因为 TTS 正在读取每个 recyclerView 项目.
First, i displayed all items in recyclerView. Afterward, I am calling the displayed item in a method having for loop to TTS play each rows(list item). The problem i am facing now is the imageView is not displaying as each recyclerView item are being read by TTS.
预期的输出是每当 TTS 为每个行项 textView 播放时,一个 imageView(#image1) 应该同时显示
Expected output is whenever TTS plays for each row item textView, An imageView(#image1) should show simultaneously
DisplayActivityResultAdapter.java
DisplayActivityResultAdapter.java
......
.......
int position = 0;
public void convertTextToSpeech() {
Multiples multiples1=items.get(position);
for (Multiples item : items) {
text = item.first + " " + item.getSecond() + " Za " + item.getResult() + ".";
tts.speak(text, TextToSpeech.QUEUE_ADD, null);
boolean speakingEnd = tts.isSpeaking();
// Toast.makeText(getApplicationContext(), "Speaking...."+position, Toast.LENGTH_SHORT).show();
// multiples1.setImage_show(true);
// mAdapter.notifyItemChanged(position);
// Log.i("values","------------------------------------------Row value-"+item.getFirst()+" X "+item.getSecond()+", Position="+position);
//------------------------
MyAdapter m= (MyAdapter) mAdapter;
m.updateItem(item,position);
position++;
}
}
}
MyAdapter.java
MyAdapter.java
.....
.....
// Replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
// - get element from your dataset at this position
// - replace the contents of the view with that element
if (holder instanceof MyAdapter.MyViewHolder) {
final MyAdapter.MyViewHolder view = (MyAdapter.MyViewHolder) holder;
Multiples p = items.get(position);
view.name.setText(p.first + " X " + p.getSecond() + "= "+p.getResult());
if(position>0) {
if (p.image_show) {
view.image1.setVisibility(View.VISIBLE);
view.image.setVisibility(View.INVISIBLE);
} else {
view.image1.setVisibility(View.INVISIBLE);
view.image.setVisibility(View.VISIBLE);
}
}
}
}
public void updateItem(Multiples newItem, int pos) {
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());
notifyItemChanged(pos,newItem);
}
// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
return items.size();
}
}
推荐答案
您的主要失败是缺少 TTS 侦听器.没有它,你不知道什么时候应该更新你的 RecyclerView
.侦听器看起来像这样:
You main fail is absence of listener for TTS. Without it you don't know when you should update your RecyclerView
.
Listener can looks like this:
class MyListener extends UtteranceProgressListener {
@Override
public void onStart(String utteranceId) {
int currentIndex = Integer.parseInt(utteranceId);
mMainAdapter.setCurrentPosition(currentIndex);
handler.post(new Runnable() {
@Override
public void run() {
mMainAdapter.notifyDataSetChanged();
}
});
}
@Override
public void onDone(String utteranceId) {
int currentIndex = Integer.parseInt(utteranceId);
mMainAdapter.setCurrentPosition(-1);
handler.post(new Runnable() {
@Override
public void run() {
mMainAdapter.notifyDataSetChanged();
}
});
if (currentIndex < data.size() - 1) {
playSound(currentIndex + 1);
}
}
@Override
public void onError(String utteranceId) {
}
}
我创建了一个测试项目来展示它是如何实现的.在这里您可以看到它是如何工作的.这里是我的 github 仓库.
I've created a test project to show how it can be implemented. Here you can see how it works. Here is my github repository.
这篇关于无法与 TTS 同步在 recyclerVIew 中显示 imageView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!