2010-08-31 2 views
255

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

Я попытался это, но не повезло:

lv.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL); 

спасибо

+0

попробовать сделать это работает ... messagesListView.setTranscriptMode (ListView.TRANSCRIPT_MODE_NORMAL); \t \t messagesListView.setStackFromBottom (true); – Superdev

+0

lv.setTranscriptMode (ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL) гарантирует, что listView будет прокручиваться после вызова adapter.notifyDataSetChanged. Если это не работает, попробуйте определить это свойство в xml, как вы можете видеть в сообщениях ниже. – tomm

ответ

382

Предполагая, что когда данные списка изменились, вы можете вручную указать списку для прокрутки вниз, установив выбор списка в последнюю строку. Что-то вроде:

private void scrollMyListViewToBottom() { 
    myListView.post(new Runnable() { 
     @Override 
     public void run() { 
      // Select the last row so it will scroll into view... 
      myListView.setSelection(myListAdapter.getCount() - 1); 
     } 
    }); 
} 
+2

почему setselection() внутри нить .. – Bhupendra

+0

@Bhupendra это не требуется. Вы можете обойтись и без потока, как показано в ответе Вартинг. – sagarpatidar

+2

@Bhupendra setSelection() обновляет пользовательский интерфейс. Вызывая сообщение (Runnable) в представлении, вы гарантируете, что Runnable-код будет запущен в потоке пользовательского интерфейса Android. Как правило, делайте это так, если вы не знаете, что уже находитесь в потоке пользовательского интерфейса, или гарантируете это другими способами. –

4

Режим транскрипт то, что вы хотите, и используется Google Talk и SMS/MMS-приложения. Правильно ли вы вызываете notifyDatasetChanged() на свой адаптер при добавлении элементов?

+0

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

+0

Режим транскрипции фактически отключен приложением SMS. Я точно не помню. – Timmmm

220

Вы должны использовать эти параметры в вашем списке:

  • свитка lv.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);

  • Установите голову списка к нему снизу lv.setStackFromBottom(true);

Вы можете также задайте эти параметры в XML, например. как это:

<ListView 
    ... 
    android:transcriptMode="alwaysScroll" 
    android:stackFromBottom="true" /> 
+22

Обратите внимание, что при таком подходе строки «стекают снизу» представления по мере их добавления. Это означает, что короткие списки будут иметь «пустое» пространство в верхней части представления, а не внизу, что не всегда то, что нужно. –

+2

Быстрый вопрос: В любом случае я могу получить прокрутку для анимации? Причина, когда я уведомляю DataSetChanged(), он перескакивает без анимации?!? – Georg

+0

@Georg Вы отключили анимацию в настройках разработчика на своем устройстве? – JonasCz

9

Использование: Установите голову списка, для его нижней lv.setStackFromBottom(true);

работал для меня, и список прокручивается на дно автоматически, когда он впервые принес в видимостью. Затем список прокручивается так, как следует, с TRANSCRIPT_MODE_ALWAYS_SCROLL.

+5

Обратите внимание, что при таком подходе строки «стекают из нижней части» представления по мере их добавления. Это означает, что короткие списки будут иметь «пустое» пространство в верхней части представления, а не внизу. –

36

Сочетание TRANSCRIPT_MODE_ALWAYS_SCROLL и setSelection сделал это работает для меня

ChatAdapter adapter = new ChatAdapter(this); 

ListView lv = (ListView) findViewById(R.id.chatList); 
lv.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL); 
lv.setAdapter(adapter); 

adapter.registerDataSetObserver(new DataSetObserver() { 
    @Override 
    public void onChanged() { 
     super.onChanged(); 
     lv.setSelection(adapter.getCount() - 1);  
    } 
}); 
124

В макете XML, установите следующие параметры для ListView.

android:stackFromBottom="true" 
android:transcriptMode="alwaysScroll" 

Cheers !!!

+0

Отличный ответ прямо на точку и без кода Java. – BlaShadow

+1

Если вы хотите сделать чат-приложение, это именно то, что вам нужно! – Stam

+2

лучший для общения приложение –

6

Я использую

setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL); 

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

+0

Вызов 'getListView(). SmoothScrollToPosition (getListAdapter.getCount() - 1);' в onstart для прокрутки до дно в начале деятельности. – palindrom

20

Я имел успех, используя это в ответ на нажатие кнопки, так что я думаю, что вы можете использовать его тоже после обновления содержимого:

myListView.smoothScrollToPosition(theListAdapter.getCount() -1); 
+0

Это отличное решение. Простая, одна строка. –

+0

хороший ответ. И он поддерживает анимацию в виде сетки! спасибо –

8

Чтобы получить это в ListFragment:

getListView().setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL); 
getListView().setStackFromBottom(true);` 

Добавил этот ответ, потому что, если кто-то ищет google-поиск той же проблемы с ListFragment, он просто находит это.

С уважением

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