0

Я использую smoothScrollToPosition для прокрутки RecyclerView. Он выполняет прокрутку каждый раз при вставке новой записи; но вверху, а не на дно, которое я хочу.RecyclerView прокручивается в неправильном направлении при вставке нового элемента

list_chat = (RecyclerView) findViewById(R.id.list_chat); 
    //Set up Layout Manager 
    linearLayoutManager = new LinearLayoutManager(this); 
    linearLayoutManager.setStackFromEnd(true); 
    list_chat.setLayoutManager(linearLayoutManager); 
    //set adapter 
    list_chat.setAdapter(adapter); 
    //set scroll 
    list_chat.post(new Runnable() { 
     @Override 
     public void run() { 
      list_chat.smoothScrollToPosition(adapter.getItemCount()); 
     } 
    }); 

Адаптер от Firebase

adapter = new FirebaseRecyclerAdapter<ChatItem, ChatRecylerViewHolder>(ChatItem.class,R.layout.chat_item 
     ,ChatRecylerViewHolder.class,queryChat ) { 
     @Override 
     protected void populateViewHolder(ChatRecylerViewHolder viewHolder, ChatItem model, int position) { 
      viewHolder.tvAuthorChat.setText(model.chatAuthor); 
      viewHolder.tvContentChat.setText(model.chatContent); 
     } 
    }; 
+0

Я обновил свой ответ. Взгляните, если это не поможет оставить комментарий. –

ответ

0

Ok. Я нашел ответ. Во-первых, старая проблема с моим вопросом: я думал, что list_chat.post вызывается всякий раз, когда элемент вставлен (получается, что это неправильно). Причиной для этого остается прокрутка top linearLayoutManager.setStackFromEnd(true); Таким образом, вопрос сводится к Где назвать прокрутку? Ответ: Поскольку адаптер управляет данными, имеет смысл угадать, что адаптер уведомит о вставке. Вот код

adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() { 
     @Override 
     public void onItemRangeInserted(int positionStart, int itemCount) { 
      super.onItemRangeInserted(positionStart, itemCount); 
      list_chat.smoothScrollToPosition(adapter.getItemCount()); 
     } 
    }); 
2

Вы заметили, вы используете linearLayoutManager.setStackFromEnd(true); это означает, что вы первый позиция находится в нижней части. Я предлагаю вам лучший вариант.

RecycleView не работает так, как ListView работы, вы можете просматривать его с помощью менеджера компоновки что-то вроде этого

linearLayoutManager.scrollToPositionWithOffset(position,offset); 

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

linearLayoutManager.scrollToPosition(position); 
+0

Сначала я думал, что list_chat.post - это событие, когда вставлен новый элемент. Но, как я просто проверить, это не так. Итак, теперь мой вопрос: «куда вытащить обновление linearLayoutManager.scrollToPosition (position);?» – cuongptnk

+0

В каком случае можно прокручивать линию прокрутки? Я мог бы ввести внутри кнопку «Отправить»; но что только обновление для нового сообщения отправляется от меня. Как получить событие, когда другие отправляют сообщение? – cuongptnk

+0

Причина, по которой он держит прокрутку, состоит в том, что linearLayoutManager.setStackFromEnd (true); Комментируя это, держите экран в покое. Но все же, где назвать прокрутку обновления? list_chat.smoothScrollToPosition (adapter.getItemCount()); работает для специального тестирования. Поэтому я не думаю, что linearLayoutManager.scrollToPosition (позиция); - ответ. – cuongptnk

Смежные вопросы