Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android ListView setSelectionFromTop not working

I have created a dynamic ListView where objects are added from top.

When the user press a button the listView is updated from the contents of an array, then notifyDataSetChanged() is called on the custom arrayAdapter.

Now I want to mantain the list position when adding, so I added this code:

        // pausedCounter trace the number of objects(lines) to add to the listView
        int idx = listView.getFirstVisiblePosition() + pausedCounter;
        View first = listView.getChildAt(0);
        int position = 0;

        if (first != null)
            position = first.getTop();

        // cycle to add the new objects to the listView
        for (Tweet[] tweets1 : pausedTweets)
            super.updateTweets(tweets1);


        listView.setSelectionFromTop(idx, position);

        // reset of counter and accumulator
        pausedTweets = new ArrayList<Tweet[]>();
        pausedCounter = 0;

This code behave in this way: if the getFirstVisiblePosition returns 2, and the pausedCounter is 5, after the update the list will be set to the 3th of the new five elements.

What I want is to have the first visible element of the list set to the 8th.

After further tests I found out that the number of childrens of the listView doesn't change during the run of this piece of code, so it updates the size of the listView after I called setSelectionFromTop. Could be this the problem?

like image 951
Marco Fedele Avatar asked Aug 18 '13 20:08

Marco Fedele


1 Answers

The trick was this:

        listView.post(new Runnable() {
            @Override
            public void run() {
                listView.setSelectionFromTop(idx, finalPosition);
            }
        });

Using the post method permits to wait the update of the ListView before change position.

like image 64
Marco Fedele Avatar answered Sep 27 '22 20:09

Marco Fedele