2015-04-21 7 views
1

У меня есть ListView для моего чата. Когда приходит новое сообщение, мне нужно прокрутить этот список вниз автоматически. Я сделал это с помощьюКак сделать Listview с нормальным режимом транскрипции прокручивается плавно?

chatView.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_NORMAL); 

Все работает как шарм, но я хочу перечислить прокручивать вниз гладко, как с smoothScrollBy() методом. Теперь он просто прыгает до конца, когда вызывается notifyDataSetChanger().

Как я могу это достичь? Вот мой ListView XML элемент, на всякий случай:

<ListView 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:stackFromBottom="true" 
     android:clipToPadding="false" 
     android:divider="@null" android:dividerHeight="4dp" 
     android:id="@+id/chat" 
     android:layout_weight="1" 
     android:background="@color/background_green" 
     android:paddingBottom="@dimen/between_elements_spacing"/> 

ответ

-1

вы пробовали, используя этот

list.smoothScrollToPosition(postitionOfRow); 

notifyData не следует прокрутки в любом месте, если они используются правильно. можете ли вы опубликовать код, где вы это делаете?

+2

Неправильно. В режиме транскрипции listview, настроенном на «AbsListView.TRANSCRIPT_MODE_NORMAL», он будет автоматически прокручивать его. От разработчиков Android: «TRANSCRIPT_MODE_NORMAL: список будет автоматически прокручиваться донизу, когда будет получено уведомление об изменении набора данных, и только если последний элемент уже отображается на экране». (http://goo.gl/IH9W0B) И нет, если я делаю то, что вы говорите, после того, как каждый набор данных изменил уведомление - он все еще теперь прокручивается плавно из-за режима транскрипции. – udenfox

+0

* Это все еще НЕ прокрутка гладкая, я имел в виду. – udenfox

+0

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

0

Я нахожу это немного расстраивающим, что режим транскрипции не имеет «анимированной» опции. Способ сделать это, чтобы отключить режим транскрипт, и после вызова notifyDataSetChanged():

if (determineIfListViewShouldAutoScroll()) { 
    mainThreadHandler.post(() -> { 
     listView.setSelection(adapter.getCount() - 2); 
    }); 
    mainThreadHandler.post(() -> { 
     listView.smoothScrollToPosition(adapter.getCount()); 
    }); 
} 

Поскольку вы имеете режим отключил транскриптов, теперь вам нужно создать determineIfListViewShouldAutoScroll() функцию, которая определяет, является ли или не делать ничего. Используйте chatListView.getLastVisiblePosition(), чтобы определить, прокручивается ли просмотр списка достаточно далеко, чтобы заслужить автоматическое отображение нового элемента. Для чего-то похожего на режим транскрипции «нормальный» вы просто проверите, что последнее видимое положение позиции находится в пределах 1 или 2 от общего количества предметов.

Это не дает вам никакого контроля над анимацией, просмотр списка сделает все, что он хочет. Если вам нужно больше , вы можете запустить настраиваемую анимацию, которую каждый тик вызывает listView.setSelectionFromTop(lastItemPosition, listviewHeight - distanceY);, где listviewHeight - это высота всего списка, а distanceY - анимированное значение от 0 до измеренной высоты нового представления.

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