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

  1. Добавить Зависимость -> следовать этому

  2. в макете добавьте новый корневой тег "<макет"

                //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>
    
  3. Часть 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 будет обрабатывать обновление данных.