Прокрутка Android ListView до початку


80

У мене є ListViewкористувацькі рядки. При натисканні будь-якого з цих рядків дані ListView відтворюються. Я б хотів, щоб список прокручувався до початку, коли це трапляється.

Спочатку я спробував використовувати setSelection(0)в кожному рядку, OnClickListener щоб досягти цього, але не вдалося (я вважаю, тому що ListView втрачає позицію прокрутки, коли його дані втрачають силу - тому мій виклик setSelection скасовано. Я все ще не розумію, як ListView вирішує, де прокрутити до після визнання недійсним).

Єдине робоче рішення, яке мені відомо, дав Ромен Гай тут: http://groups.google.com/group/android-developers/browse_thread/thread/127ca57414035301

Це передбачає ( View.post) заклик до _listView.setSelection(0). Я виявив, що це працює досить погано. Нещодавно створений список відображається з незмінним розташуванням прокрутки, і перед прокруткою назад до початку існує значна затримка.

Чи є кращий спосіб досягти цієї функціональності?

Будь-яка допомога буде дуже вдячна.

Дякую!

Відповіді:


132

дзвінок, listView.setSelectionAfterHeaderView();щоб прокрутити до початку


66
саме так я б це назвав.
markshiz

102

Я багато пробував, але цей працював у мене

list.smoothScrollToPosition(0);

3
Це круто. Цікаво, чи можете ви змінити швидкість прокрутки.
theblang

Чи може бути також зворотний дзвінок, щоб дізнатись, коли закінчується набір, щоб я міг перейти до наступного екрана?
Амол Гупта

41

Я просто використовую listview.setSelection(0);

Для мене чудово працює.


5

Якщо вам потрібна миттєва прокрутка відразу після зміни ListViewданих адаптера, зверніть увагу, що вона може ще не заповнена. У цьому випадку ви повинні скористатися post()вашим setSelection()або setSelectionAfterHeaderView()через, Handlerщоб він був викликаний пізніше в черзі.

listView.Handler.post(new Runnable() {
            @Override
            public void run() {
                listView.setSelectionAfterHeaderView();    
            }
        });

Це спрацювало для мене.


4

Особисто я рекомендую вам знайти інший шаблон інтерфейсу користувача. Цілком можливо, що користувачі знайдуть ваш поточний підхід "клік і список змінюється in situ " інтуїтивно зрозумілим, але я скептично налаштований.

Ви можете спробувати підкласифікацію ListViewта перевизначення, layoutChildren()щоб прив’язати до суперкласу, а потім зателефонувати setSelection(0)у випадку, коли це потрібно. Якщо "значна затримка" пов'язана лише із post()дзвінком, це має прояснити ситуацію.


4
Дякую за пропозицію, я скоро спробую. Список змінюється in situ, оскільки сухарі відображаються деінде на екрані - типові конструкції інтерфейсу Android менш підходять для моїх конкретних цілей та цільових користувачів. Крім того, дякую за ВСЮ вашу допомогу - я прочитав низку ваших відповідей на stackoverflow та вашу літературу CommonsWare, і вони суттєво допомогли мені розпочати роботу на цій платформі!
aakash

це спосіб зробити це, ніяких магічних методів, лише чиста логіка. Дякую!
Лео підтримує Моніку Челліо

2

як обхідний шлях можна створити новий адаптер, що містить нові регенеровані дані, а потім викликати ListView.setAdapter. після цього виклику ListView.setSelection (n).

До речі, розроблене спільне програмне забезпечення працює.


2

На якусь іншу вимогу. Якщо ви хочете прокрутити вгору, як під час спілкування в чаті.

        mListView.smoothScrollToPosition(mAdapter.getCount());

2

Цей чудово працював, коли ви хочете сфокусувати текст редагування із заголовка списку

listview.setSelectionFromTop(0,0);

Якщо ви хочете вибрати конкретний вигляд індексу зі списку, тоді

listview.setSelection(index); // o for top
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.