Android ListView прокрутка вверх - PullRequest
78 голосов
/ 23 мая 2010

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

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

Единственное известное мне рабочее решение было дано Романом Гаем: http://groups.google.com/group/android-developers/browse_thread/thread/127ca57414035301

Включает (View.post) вызов на _listView.setSelection(0). я нашел это выполнять довольно плохо. Вновь созданный список отображается с неизменным расположением прокрутки и существует значительная задержка, прежде чем он прокручивается обратно к вершине.

Есть ли лучший способ добиться этой функциональности?

Любая помощь будет высоко ценится.

Спасибо!

Ответы [ 8 ]

128 голосов
/ 01 февраля 2011

вызов listView.setSelectionAfterHeaderView(); для прокрутки к началу

101 голосов
/ 10 августа 2012

Я много пробовал, но этот работал для меня

list.smoothScrollToPosition(0);
39 голосов
/ 07 апреля 2011

Я просто использую listview.setSelection(0);

У меня отлично работает.

5 голосов
/ 27 апреля 2015

Если вам нужна мгновенная прокрутка сразу после изменения данных ListView адаптера, обратите внимание, что они могут быть еще не заполнены. В этом случае вам нужно post() ваш setSelection() или setSelectionAfterHeaderView() через Handler, чтобы он позже вызывался в очереди.

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

Это сработало для меня.

4 голосов
/ 23 мая 2010

Лично я рекомендую вам найти другой шаблон пользовательского интерфейса. Возможно, что пользователи сочтут ваш текущий «щелчок» и список изменений in situ «интуитивным, но я настроен скептически.

Вы можете попробовать создать подкласс ListView и переопределить layoutChildren(), чтобы связать его с суперклассом, а затем вызвать setSelection(0), если это необходимо. Если "значительная задержка" вызвана только вызовом post(), это должно устранить ее.

2 голосов
/ 25 октября 2016

По некоторым другим требованиям. Если вы хотите прокрутить вверх, как в чате.

        mListView.smoothScrollToPosition(mAdapter.getCount());
2 голосов
/ 13 сентября 2010

В качестве обходного пути можно создать новый адаптер, содержащий новые восстановленные данные, а затем вызвать ListView.setAdapter. после этого вызовите ListView.setSelection (n).

Кстати, решение, предоставленное commonsware, работает.

1 голос
/ 09 июля 2018

Этот работал нормально, когда вы хотите сфокусировать текст редактирования из заголовка списка

listview.setSelectionFromTop(0,0);

Если вы хотите выбрать конкретный индекс из списка, тогда

listview.setSelection(index); // o for top
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...