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

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

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

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

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

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

Любая помощь приветствуется.

Благодаря!

Solutions Collecting From Web of "Android ListView прокрутка вверх"

Call listView.setSelectionAfterHeaderView(); Прокрутить вверх

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

 list.smoothScrollToPosition(0); 

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

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

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

Вы можете попробовать подклассифицировать ListView и переопределить layoutChildren() для 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());