ListView прокрутите список до конца после обновления списка

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

Я пробовал это, но не повезло:

lv.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);

спасибо

8 ответов


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

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);
        }
    });
}

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

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

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

вы также можете установить эти параметры в XML, например. вот так:

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

сочетание 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);    
    }
});

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

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

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

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


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

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

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

в отношении


Я использую

setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL);

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


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