Android ListView scrolling to top

AndroidListview

Android Problem Overview


I have a ListView with custom rows. When any of these rows is clicked, the ListView's data is regenerated. I'd like the list to scroll back to the top when this happens.

I initially tried using setSelection(0) in each row's OnClickListener to achieve this but was unsuccessful (I believe because the ListView loses its scroll position when its data is invalidated - so my call to setSelection is undone. I still don't understand how the ListView decides where to scroll to after invalidation, though).

The only working solution I know of was given by Romain Guy here: http://groups.google.com/group/android-developers/browse_thread/thread/127ca57414035301

It involves (View.post)ing the call to _listView.setSelection(0). I found this to perform quite poorly. The newly generated list shows up with its scroll location unchanged and there is a considerable delay before it scrolls back to the top.

Is there any better way to achieve this functionality?

Any help would be much appreciated.

Thanks!

Android Solutions


Solution 1 - Android

call listView.setSelectionAfterHeaderView(); to scroll to top

Solution 2 - Android

I have tried lot but this one worked for me

list.smoothScrollToPosition(0);

Solution 3 - Android

I simply use listview.setSelection(0);

Works fine for me.

Solution 4 - Android

If you need instant scroll just after ListView adapter's data was changed, pay attention that it might not be yet populated. In this case you should post() your setSelection() or setSelectionAfterHeaderView() via Handler so it will be called later in the queue.

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

This worked for me.

Solution 5 - Android

Personally, I recommend you find a different UI pattern. It is possible that users will find your current "click, and the list changes in situ" approach intuitive, but I am skeptical.

You could try subclassing ListView and overriding layoutChildren() to chain to the superclass, then call setSelection(0) in the case where that is needed. If the "considerable delay" is due to just the post() call, this should clear it up.

Solution 6 - Android

as a workaround, you can create a new adapter containing the new regenerated data, then call ListView.setAdapter. after that call ListView.setSelection(n).

btw, the solution provided by commonsware is worked.

Solution 7 - Android

On some different requirement. If you want to scroll up just like while chatting.

        mListView.smoothScrollToPosition(mAdapter.getCount());

Solution 8 - Android

This one worked fine when you want to focus the edittext from listview header

listview.setSelectionFromTop(0,0);

If you want to select the particular index view from listview then

listview.setSelection(index); // o for top

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionaakashView Question on Stackoverflow
Solution 1 - AndroidD. B.View Answer on Stackoverflow
Solution 2 - AndroidN20084753View Answer on Stackoverflow
Solution 3 - AndroidradhooView Answer on Stackoverflow
Solution 4 - AndroidDmitry PolomoshnovView Answer on Stackoverflow
Solution 5 - AndroidCommonsWareView Answer on Stackoverflow
Solution 6 - Androidshaobin0604View Answer on Stackoverflow
Solution 7 - AndroidHafizView Answer on Stackoverflow
Solution 8 - AndroidSampath KumarView Answer on Stackoverflow