1

У меня есть RecyclerView, который ими используется для отображения сообщений в виде текстового приложения. Под этим я подразумеваю, что новые сообщения, добавленные в RecyclerView, должны появиться внизу.Элементы, добавленные в RecyclerView, не показаны внизу

В настоящее время им с помощью .setStackFromEnd(true) на моем LinearLayoutManager, чтобы сообщения появляются, начиная с нижней части:

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

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

То, что происходит, когда достаточное количество сообщений принимаются и список сообщений о переполняться мимо верхней части на экране он всегда останавливается, показывая новые сообщения внизу. Мне нужно прокрутить вниз вручную, чтобы увидеть новые дополнения.

Как я могу получить его, чтобы либо всегда иметь новое сообщение, либо просматривать RecyclerView, когда новый элемент получен?

Я пробовал различные методы в моем менеджере компоновки, например .scrollToPosition() и .scrollToPositionWithOffset(), но ни один из предложений, которые я видел до сих пор, не работал. Некоторые из главных вопросов StackOverflow по этой проблеме имеют верные ответы, которые даже не решают исходный вопрос.

Как это сделать?

+0

При попытке '.scrollToPosition()' вы назвали его в менеджере компоновки или RecyclerView? –

+0

Я попробовал оба. Какой из них правильный? Насколько я могу судить, они не имели эффекта. – Orbit

ответ

0

Попробуйте это, Am также разрабатывает приложение чата, и она отлично работает для меня

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

Помимо .setHasFixesSize (что я не думаю, что имеет отношение к этой проблеме), это то, что у меня уже было. Как выглядит ваш xml для вашего recyclerview? – Orbit

+0

@Orbit .. Посмотрите, если его полезно – Sanoop

+0

@Orbit 'LinearLayout' содержит' EditText' и 'Button' – Sanoop

0

mRecyclerView.scrollToPosition(position); должен работать. Может случиться так, что он пытается прокручиваться до обновления позиции/адаптера. Попытайтесь:

int delay = 500; 

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

Кажется, не имеет никакого эффекта. – Orbit

+0

Можете ли вы отредактировать свой оригинальный пост с кодом, показывающим, откуда вы его звоните? –

+0

В мобильном atm, но я вызывал код, который вы отправили в мои действия onCreate(), после того, как была выполнена настройка RV и адаптера. – Orbit

1

Пожалуйста, проверьте layout_height. Это должно быть андроида: layout_height = "match_parent"

Run smoothScrollToPosition в UI потоке

фрагмент кода из моего кода

  <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" 

       /> 

// здесь topicScreenList ссылается мой Recylerview: // - messageAdapter: ссылка на объект адаптера

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

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

после получения любых новых сообщений, следующий код вызывается из бэкэнда е

-Вот MessageItem ссылается новый пункт Message потребляемую адаптер

@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); 
} 
Смежные вопросы