Android ListView прокрутка вверх

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

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

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

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

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

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

Спасибо!

Ответ 1

вызов listView.setSelectionAfterHeaderView(); для прокрутки вверх

Ответ 2

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

list.smoothScrollToPosition(0);

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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

        mListView.smoothScrollToPosition(mAdapter.getCount());