RecyclerView обновить последнюю позицию с непрерывными данными
Прежде всего, когда я доберусь до своего компьютера, я отправлю код.
Я пытаюсь добавить и обновить RecyclerViews из данных распознавания речи. Для SpeechRecognition я использую Google Cloud Speech. Я делаю "просмотр чата" каждый раз, когда речь заканчивается, добавляет результат в RecyclerView. Я хочу изменить его, добавив новый элемент при распознавании onVoice() и обновив его так же, как и при распознавании речи (результат еще не окончательный)
Мой подход был следующим: так как SpeechRecognition запускается голосом, добавляется новый элемент (onVoiceStart), так как вызывается обратный вызов распознавателей onVoice (распознается новый блок речевых данных), я удаляю последний элемент RecyclerViews и добавляем "чанк" в последнюю позицию и после этого вызывается adapter.notifyItemChanged(speechResults.size()-1)
1 ответ
Решение 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
Добавить Зависимость -> следовать этому
в макете добавьте новый корневой тег "<макет"
//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 - > вы должны включить привязку данных в сборке Gradle..item - > это имя, данное в макете для данных (должно быть одинаковым)
если вы хотите обрабатывать 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 будет обрабатывать обновление данных.