Ответ 1
вызов listView.setSelectionAfterHeaderView();
для прокрутки вверх
У меня есть ListView
с настраиваемыми строками. Когда любой из этих строк
нажмите, данные ListView будут восстановлены. Я бы хотел, чтобы список
прокрутите страницу назад, когда это произойдет.
Сначала я попытался использовать setSelection(0)
в каждой строке OnClickListener
для достижения этого, но безуспешно (я считаю, потому что ListView
теряет свою позицию прокрутки, когда ее данные недействительны, поэтому мой призыв к
setSelection отменяется. Я все еще не понимаю, как ListView
решает, где прокручиваться после недействительности, хотя).
Единственное работающее решение, о котором я знаю, было дано Роменом Гаем здесь: http://groups.google.com/group/android-developers/browse_thread/thread/127ca57414035301
Он включает (View.post
) вызов _listView.setSelection(0)
. я
нашел это, чтобы выполнить довольно плохо.
Сгенерированный список отображается с измененным местоположением прокрутки
и перед тем, как прокрутится назад, произойдет значительная задержка.
Есть ли лучший способ достичь этой функциональности?
Любая помощь будет высоко оценена.
Спасибо!
вызов listView.setSelectionAfterHeaderView();
для прокрутки вверх
Я пробовал много, но этот работал у меня
list.smoothScrollToPosition(0);
Я просто использую listview.setSelection(0);
Прекрасно работает для меня.
Лично я рекомендую вам найти другой шаблон пользовательского интерфейса. Возможно, пользователи найдут ваш текущий "щелчок" и "изменение списка на месте" интуитивно понятным, но я скептически настроен.
Вы можете попробовать подклассом ListView
и переопределить layoutChildren()
, чтобы связать его с суперклассом, а затем вызвать setSelection(0)
в том случае, если это необходимо. Если "значительная задержка" вызвана только вызовом post()
, это должно очистить его.
Если вам нужна мгновенная прокрутка сразу после изменения данных адаптера ListView
, обратите внимание на то, что он еще не заселен. В этом случае вы должны post()
использовать setSelection()
или setSelectionAfterHeaderView()
через Handler
, чтобы он был вызван позже в очереди.
listView.Handler.post(new Runnable() {
@Override
public void run() {
listView.setSelectionAfterHeaderView();
}
});
Это сработало для меня.
в качестве обходного пути вы можете создать новый адаптер, содержащий новые регенерированные данные, а затем вызвать ListView.setAdapter. после этого вызова ListView.setSelection(n).
btw, решение, предоставляемое commonsware, работает.
По некоторым различным требованиям. Если вы хотите прокручивать вверх так же, как во время чата.
mListView.smoothScrollToPosition(mAdapter.getCount());