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?
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With