18

Is there any difference between ListView.invalidateViews() and Adapter.notifyDataSetChanged()?

Gaurav Agarwal
  • 18,754
  • 29
  • 105
  • 166

1 Answers1

39

Well yes, there is.

ListView.invalidateViews() is used to tell the ListView to invalidate all its child item views (redraw them). Note that there not need to be an equal number of views than items. That's because a ListView recycles its item views and moves them around the screen in a smart way while you scroll.

Adapter.notifyDataSetChanged() on the other hand, is to tell the observer of the adapter that the contents of what is being adapted have changed. Notifying the dataset changed will cause the listview to invoke your adapters methods again to adjust scrollbars, regenerate item views, etc...

Most of the time you would want to use notifyDataSetChanged instead of invalidateViews, but it certainly depends on what you are trying to accomplish.

K-ballo
  • 80,396
  • 20
  • 159
  • 169
  • I am little confused when you say _Note that there not need to be an equal number of views than items_ . What is the difference between views and items. – Gaurav Agarwal May 20 '12 at 20:11
  • 2
    @black crow: A listview does not create a view per item. Instead it usually has only the number of views that would fit in the screen plus one, and moves them around as you scroll. In plain words: it does not create views for items that are not visible. – K-ballo May 20 '12 at 20:12
  • 2
    You have space for 10 views on the screen and you have 20 in your adapter... so you have 10 views and 20 items. – Barak May 20 '12 at 20:14
  • @Barak Thanks. Can you give one example where `invalidateViews` will be useful? – Gaurav Agarwal May 20 '12 at 20:23
  • 1
    @black crow: That is a hard example to find. If you do everything right, then `invalidateViews` will only be useful if you need to redraw the visible items yet nothing on them has changed... – K-ballo May 20 '12 at 20:24
  • 13
    @GauravAgarwal: A good use of `invalidateViews` would be to change the font size of your `ListView`: you don't touch the data, but the rendering. – Luis A. Florit Oct 19 '13 at 14:39
  • A good example is a list of running timers, you update the text only, but not the number of items – Amir Uval Mar 21 '14 at 10:25
  • Another example is suppose you want to decode the emoticons to display images, while the images are still being loaded from disk. You would call invalidate views once they are loaded – Madhur Ahuja Feb 04 '15 at 19:14