Listview przewiń do końca listy po zaktualizowaniu listy

Chciałbym się upewnić, że lista jest przewijana aż do dołu, po zaktualizowaniu listview za pomocą listAdapter, tak, że wyświetla ostatni element wprowadzony na liście. Jak mogę to zrobić ?

Próbowałem tego, ale bez powodzenia:

lv.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);

Dziękuję

Author: jramirez, 2010-08-31

8 answers

Przypuśćmy, że wiesz, kiedy dane Listy się zmieniły, możesz ręcznie powiedzieć liście, aby przewijała się na dół, ustawiając wybór listy na ostatni wiersz. Coś w stylu:

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);
        }
    });
}
 396
Author: Mason Lee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-24 16:37:57

Musisz użyć tych parametrów w widoku listy:

  • Przewiń lv.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);

  • Ustaw nagłówek listy na dole lv.setStackFromBottom(true);

Można również ustawić te parametry w XML, np. tak:

<ListView
   ...
   android:transcriptMode="alwaysScroll"
   android:stackFromBottom="true" />
 229
Author: dev.serghini,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-13 11:36:41

Kombinacja TRANSCRIPT_MODE_ALWAYS_SCROLL i setSelection sprawiła, że działa dla mnie

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);    
    }
});
 36
Author: Wärting,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-27 09:43:40

Udało mi się użyć tego w odpowiedzi na kliknięcie przycisku, więc myślę, że możesz go również użyć po zaktualizowaniu zawartości:

myListView.smoothScrollToPosition(theListAdapter.getCount() -1);
 24
Author: Álex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-08 20:12:44

Za pomocą : Ustaw nagłówek listy na dole lv.setStackFromBottom(true);

Działa dla mnie i lista jest przewijana do dołu automatycznie, gdy jest po raz pierwszy wprowadzony do widoczności. Następnie lista przewija się tak, jak powinna za pomocą TRANSCRIPT_MODE_ALWAYS_SCROLL.

 10
Author: Kevin Parker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-10 07:11:15

Aby umieścić to w fragmencie listy:

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

Dodał tę odpowiedź, ponieważ jeśli ktoś szuka w google tego samego problemu z ListFragment, po prostu znajdzie to..

Pozdrawiam

 9
Author: Klatschen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-07 07:26:35

Używam

setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL);

Aby dodawać wpisy na dole, a starsze wpisy przewijać na górze, jak zapis czatu

 7
Author: Plugie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-16 14:13:56

Tryb transkrypcji jest tym, czego chcesz i jest używany przez Google Talk i aplikację SMS/MMS. Czy poprawnie wywołujesz notifyDatasetChanged () na adapterze podczas dodawania elementów?

 4
Author: Romain Guy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-31 06:42:35