1

Ich habe eine RecyclerView die ich benutze, um Nachrichten anzuzeigen, in einer Text-App-Art. Damit meine ich, dass neue Nachrichten, die dem RecyclerView hinzugefügt werden, unten erscheinen sollten.Artikel, die zu RecyclerView hinzugefügt werden, werden nicht unten angezeigt

Derzeit im .setStackFromEnd(true) auf meinem LinearLayoutManager mit Meldungen erscheinen lassen von unten beginnend:

layMng = new LinearLayoutManager(this); 
layMng.setStackFromEnd(true); 

mRecyclerView.setLayoutManager(layMng); 
mRecyclerView.setAdapter(mAdapter); 

Was passiert, ist, wenn genügend Nachrichten empfangen werden und die Liste der Nachrichten über vergangene oben zum Überlauf von Auf dem Bildschirm werden immer die neuen Nachrichten unten angezeigt. Ich muss manuell nach unten scrollen, um die neuen Ergänzungen zu sehen.

Wie kann ich erreichen, dass entweder immer die neueste Nachricht angezeigt wird oder die RecyclerView nach unten scrollen, wenn ein neues Element empfangen wird?

Ich habe verschiedene Methoden auf meinem Layout-Manager wie .scrollToPosition() und .scrollToPositionWithOffset() versucht, aber keiner der Vorschläge, die ich bis jetzt gesehen habe, hat funktioniert. Ein paar der Top StackOverflow Fragen zu dem Problem haben Top-Antworten, die nicht einmal die ursprüngliche Frage lösen.

Also wie ist das gemacht?

+0

Wenn Sie versucht, '.scrollToPosition()' hast du nennen es verbraucht wird, werben? –

+0

Ich habe beides versucht. Welches ist korrekt? Soweit ich sagen konnte, hatten sie keinen Effekt. – Orbit

Antwort

0

das Versuchen, die Entwicklung Am auch eine Chat-Anwendung, und es funktioniert perfekt für mich

mRecyclerView.setAdapter(adaptorChat); 
    mRecyclerView.setHasFixedSize(true); 
    LinearLayoutManager llm = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false); 
    llm.setStackFromEnd(true); 
    mRecyclerView.setLayoutManager(llm); 

XML

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 


    <android.support.v7.widget.RecyclerView 
     android:id="@+id/messages_list_sponsor" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/edit_compose_msg_container" /> 

    <LinearLayout 
     android:id="@+id/edit_compose_msg_container" 
     android:layout_width="match_parent" 
     android:layout_height="70dp" 
     android:layout_alignParentBottom="true" 
     android:layout_centerHorizontal="true" 
     android:orientation="horizontal" 
     android:padding="3dp"> 

     <EditText 
      android:id="@+id/compose_edit_text" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:layout_marginLeft="10dp" 
      android:layout_marginStart="10dp" 
      android:layout_weight="1" 
      android:background="@drawable/white_edit_text_style" 
      android:hint="@string/enter_message" 
      android:inputType="textMultiLine" 
      android:minHeight="50dp" 
      android:paddingEnd="4dp" 
      android:paddingLeft="6dp" 
      android:paddingRight="4dp" 
      android:paddingStart="6dp" 
      android:singleLine="false" 
      android:textColor="@color/black" 
      android:textColorHint="@android:color/darker_gray" /> 

     <ImageView 
      android:id="@+id/send_button" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center" 
      android:layout_weight="5" 
      android:clickable="true" 
      android:padding="15dp" 
      android:rotation="-35" 
      android:layout_marginBottom="5dp" 
      android:src="@drawable/message_send" /> 
    </LinearLayout> 
</RelativeLayout> 
+0

Abgesehen von .setHasFixesSize (was ich glaube nicht, ist relevant für dieses Problem) das ist, was ich bereits hatte. Wie sieht dein XML für deine Recyclerview aus? – Orbit

+0

@Orbit .. Überprüfen Sie jetzt .. Sehen Sie, wenn es nützlich ist – Sanoop

+0

@Orbit 'LinearLayout' enthält die' EditText' und 'Button' – Sanoop

0

mRecyclerView.scrollToPosition(position); funktionieren sollte. Es kann sein, dass versucht wird, zu scrollen, bevor die Position/der Adapter aktualisiert wird. Versuchen Sie:

int delay = 500; 

Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 
    public void run() { 
     //scroll to bottom 
     mRecyclerView.smoothScrollToPosition(mAdapter.getItemCount()); 
    } 
}, delay); 
+0

Scheint keinen Effekt zu haben. – Orbit

+0

Können Sie Ihren ursprünglichen Post mit Code bearbeiten, der anzeigt, woher Sie ihn anrufen? –

+0

Auf Handy atm, aber ich rief den Code an, den Sie in meinen Activities onCreate() gepostet haben, nachdem alle RV- und Adapter-Einstellungen vorgenommen wurden. – Orbit

1

Überprüfen Sie bitte layout_height. Es sollte android sein: layout_height = "match_parent"

Run smoothScrollToPosition in UI-Thread

Code-Schnipsel aus meinem Code

  <android.support.v7.widget.RecyclerView 
       android:id="@+id/topic_screen_list" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:layout_marginBottom="18dp" 

       /> 

// hier topicScreenList verweist meinen Recylerview: // - messageAdapter: adpapter Objekt referenzieren

@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 

    LinearLayoutManager layoutManager = new LinearLayoutManager(getContext()); 
    layoutManager.setStackFromEnd(true); 
    topicScreenList.setLayoutManager(layoutManager); 
    topicScreenList.setAdapter(messageAdapter); 
} 

nach neuen Nachrichten erhalten, wird folgender Code aus Backend-servic genannt e

-Hier MessageItem neue Nachricht Artikel von Adapter auf dem Layout Manager oder der RecyclerView

@Override 
public void onNewMessage(final MessageItem messageItem) { 
    if (getActivity() != null) { 
     getActivity().runOnUiThread(new Runnable() { 
      @Override 
      public void run() {     
       messageAdapter.addMessageToEnd(messageItem); 

     topicScreenList.smoothScrollToPosition(messageAdapter.getItemCount()); 

      } 
     }); 
    } 
} 


//code from my Adapter 
public void addMessageToEnd(MessageItem messageItem) { 
    messageItems.add(messageItem); 
    notifyItemInserted(messageItems.size() -1); 
} 
Verwandte Themen