RecyclerView使用连续数据更新最后位置

时间:2018-02-08 19:38:12

标签: android android-recyclerview recycler-adapter android-viewholder google-cloud-speech

首先,当我到达我的电脑时,我会发布代码。

我正在尝试从Speechrecognition数据添加和更新RecyclerViews。 对于SpeechRecognition,我正在使用Google Cloud Speech 每次语音完成后我都会将结果添加到RecyclerView,我正在进行“聊天 - 查看”。我想通过添加新项来修改它,因为onVoice()被识别并更新它,因为识别语音(结果仍然不是最终的)

我的方法是:当语音触发语音时,新项目被添加(onVoiceStart),因为触发了识别器onVoice回调(识别出新的语音数据块)我将删除RecyclerViews最后一项并添加“块”调用adapter.notifyItemChanged(speechResults.size() - 1)

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

  1. 添加依赖性 - >关注this

  2. 在布局中
  3. 添加新的根标签“< 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>
    
  4. 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);
    
  5. 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将处理数据刷新。