How do I check when my ListView has finished redrawing?
I have a ListView
. I updated its adapter, and call notifydatasetchanged()
. I want to wait until the list finishes drawing and then call getLastVisiblePosition() on the list to check the last item.
Calling getLastVisiblePosition()
right after notifydatasetchanged()
doesn't work because the list hasnt finished drawing yet.
Solution 1:
Hopefully this can help:
- Setup an
addOnLayoutChangeListener
on the listview - Call
.notifyDataSetChanged()
; - This will fire off the
OnLayoutChangeListener
when completed - Remove the listener
-
Perform code on update (
getLastVisiblePosition()
in your case)mListView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { @Override public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { mListView.removeOnLayoutChangeListener(this); Log.e(TAG, "updated"); } }); mAdapter.notifyDataSetChanged();
Solution 2:
I think this implementation can solve the problem.
// draw ListView in UI thread
mListAdapter.notifyDataSetChanged();
// enqueue a message to UI thread
mListView.post(new Runnable() {
@Override
public void run() {
// this will be called after drawing completed
}
});