14

I though this would be a simple task, but apparently there is no way to scroll listview to the bottom. All solutions that I found are using variations of setSelection(lastItem) method which only sets selection to last item, but does not scrolls to the bottom of it.

In my case I have a empty listview (with a long empty view header set) and I want to scroll to bottom of it.

So, is there a way to do it?

Edit:

So for those who are interested the working solution is:

getListView().setSelectionFromTop(0, -mHeader.getHeight());

and

getListView().scrollTo(mOffset)

This also works, with right offset (calculated based on current scroll position), but might give you some unexpected results.

Sver
  • 3,349
  • 6
  • 32
  • 53
  • possible duplicate of [Android scroll to the bottom of a listview](http://stackoverflow.com/questions/14454953/android-scroll-to-the-bottom-of-a-listview) – DroidDev Mar 12 '14 at 07:29
  • refer this best solution if you are developing an chatting app http://stackoverflow.com/questions/3606530/listview-scroll-to-the-end-of-the-list-after-updating-the-list – Aniruddha K.M May 11 '15 at 13:37

10 Answers10

38

If you want the list view to be scrolled always at the bottom even when you are updating the list view dynamically then you can add these attributes in list view itself.

android:stackFromBottom="true"
android:transcriptMode="alwaysScroll"
Rana Ranvijay Singh
  • 6,055
  • 3
  • 38
  • 54
19

use the following

    lv.setSelection(adapter.getCount() - 1);
WISHY
  • 11,067
  • 25
  • 105
  • 197
11

If you would like to have a scroll animation programmatically you could easily scroll to the bottom of the list using:

listView.smoothScrollToPosition(adapter.getCount());

scrolling to the top most of the list can be achieved using:

listView.smoothScrollToPosition(0);
Aryo
  • 4,349
  • 2
  • 28
  • 24
3

Try this one.. it will solve your problem, i tried it and it works great.

   listView.post(new Runnable(){
             public void run() {
             listView.setSelection(listView.getCount() - 1);
    }});
Steve
  • 1,022
  • 2
  • 9
  • 30
3
private void scrollMyListViewToBottom() {
    myListView.post(new Runnable() {
        @Override
        public void run() {
            // Select the last row so it will scroll into view...
            myListView.setSelection(myListAdapter.getCount() - 1);
        }
    });
}

Its working for me

Pradip
  • 315
  • 1
  • 4
  • 12
1

Use following and try.

listview.setSelection(adapter.getCount()-1);

Pratik Dasa
  • 7,439
  • 4
  • 30
  • 44
  • Please read my question again, there is only one child in the listivew and I want to scroll to the bottom of it. There is no adapter, only empty view (view set through lv.setEmptyView(view)). – Sver Sep 25 '13 at 05:50
1

You might want to try myListView.smoothScrollToPosition(myListView.getCount() - 1). This way, you're not forced into selecting the last row. Plus, you get some smooth, beautiful scrolling! (:

Hunter S
  • 1,293
  • 1
  • 15
  • 26
1

I Had the same problem, This works best for me

listView.setSelection(listView.getAdapter().getCount()-1);
0

if there is no adapter set to your ListView then it has no children at all, empty view is not a child of your ListView

pskink
  • 23,874
  • 6
  • 66
  • 77
  • Yes, sorry, I got it a little bit wrong here, there is situation where there are only empty view (no problems here), and when there are only header, which counts as children (need to scroll to it's bottom). – Sver Sep 25 '13 at 06:42
-2

Try using list.scrollTo(0, list.getHeight());

Maxim Efimov
  • 2,747
  • 1
  • 19
  • 25
  • 3
    This method causes overscroll - listview is extended (with lot's of empty space at bottom) and the moment you try to scroll it it shrinks back. – Sver Sep 25 '13 at 05:41
  • Ok, the direction was right you just need to scroll with a right offset. – Sver Sep 25 '13 at 06:09