首先,当我到达我的电脑时,我会发布代码。
我正在尝试从Speechrecognition数据添加和更新RecyclerViews。 对于SpeechRecognition,我正在使用Google Cloud Speech 每次语音完成后我都会将结果添加到RecyclerView,我正在进行“聊天 - 查看”。我想通过添加新项来修改它,因为onVoice()被识别并更新它,因为识别语音(结果仍然不是最终的)
我的方法是:当语音触发语音时,新项目被添加(onVoiceStart),因为触发了识别器onVoice回调(识别出新的语音数据块)我将删除RecyclerViews最后一项并添加“块”调用adapter.notifyItemChanged(speechResults.size() - 1)
答案 0 :(得分:0)
解决方案I:
// Step 1: find the holder
RecyclerView.ViewHolder holder = recyclerView.findViewHolderForAdapterPosition(speechResults.size() - 1);
// Step 2: Check if the holder is not null and if has itemView .
if (holder != null) {
if (holder.itemView != null) {
// from itemview find the TextView and set the desired text :
if (holder.getAdapterPosition() == speechResults.size() - 1) {
((TextView) holder.itemView.findViewById(R.id.speech_sent_textView))
.setText(text);
}
}
解决方案II:使用库LastAdapter
添加依赖性 - >关注this
添加新的根标签“< layout”
//Delte the space after "<"
< layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="item" type="com.github.nitrico.lastadapterproject.item.Header"/>
</data>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
// you use like thius "@{youritem.speecSent"
android:text="@{item.text}"/>
//Delte the space after "< "
< /layout>
注意:对于使用多个布局,数据标记必须具有相同的变量名称。
<data>
// this name has to be same in every xml layout types.
<variable name="item" type="com.github.nitrico.lastadapterproject.item.Header"/>
</data>
Java部分: 注意: listOfItems必须是Observable ArrayList
speechResults = new ObservableArrayList<>();
...
new LastAdapter(speechResults , BR.item)
.map(SpeechResult.class, R.layout.speech_sent)
.map(SpeechResult.class, R.layout.speech_received)
.into(recyclerView);
BR.item - &gt;您必须在构建Gradle中启用数据绑定。 .item - &gt;是数据布局中给出的名称(必须相同)
如果要使用相同的Item类型(Class)处理LayoutType
new LastAdapter(speechResults, BR.item )
.map(SpeechResult.class, R.layout.speech_sent_content)
.map(SpeechResult.class, R.layout.speech_received_content)
.handler(new TypeHandler() {
@Nullable
@Override
public BaseType getItemType(Object o, int i) {
if(((SpeechResult) o).getSpeechType()==SpeechResult.SPEECH_TYPE_SENT){
return new BaseType(R.layout.speech_sent_content);
}
return new BaseType(R.layout.speech_received_content);
}
})
.into(recyclerView);
在recyclerView中添加新项目 只需将项目添加到您的项目列表中。 LastAdapter将处理数据刷新。