Custom cursor adapter calling bindView multiple times
android, android-cursoradapter, android-gridview
Solution
The operating system may call `bindView` multiple times so that it can measure and lay out the list correctly. This is not a bug so much as the way it has to be. This, along with smoothness of scrolling, is why `bindView` implementations need to be as efficient as possible. There are some nice tips and tricks you can use detailed on the Android Developers Page.
Problem
I have been suffering this issue for months and months (but now I am performance tuning). However, I now desperately need to know why my adapter feels it is necessary to run `bindView` up to 4 times on a record. I have a custom cursor adapter that populates a gridview. Some debug to show what's going on: ``` 03-08 14:46:47.980: I/AdapterCursorGrid(20724): newView() 03-08 14:46:48.470: I/AdapterCursorGrid(20724): bindView() 03-08 14:46:48.570: I/AdapterCursorGrid(20724): -------------------------- 03-08 14:46:48.570: I/AdapterCursorGrid(20724): bindView() Record Id: 1 03-08 14:46:48.570: I/AdapterCursorGrid(20724): bindView() Cursor Position: 0 03-08 14:46:48.570: I/AdapterCursorGrid(20724): bindView() View Type: 0 03-08 14:46:48.570: I/AdapterCursorGrid(20724): -------------------------- 03-08 14:46:48.600: D/AdapterCursorGrid(20724): bindView() Avatar empty... 03-08 14:46:48.690: D/AdapterCursorGrid(20724): bindView() Picture creation... 03-08 14:46:49.490: I/AdapterCursorGrid(20724): bindView() 03-08 14:46:49.501: I/AdapterCursorGrid(20724): -------------------------- 03-08 14:46:49.501: I/AdapterCursorGrid(20724): bindView() Record Id: 1 03-08 14:46:49.501: I/AdapterCursorGrid(20724): bindView() Cursor Position: 0 03-08 14:46:49.501: I/AdapterCursorGrid(20724): bindView() View Type: 0 03-08 14:46:49.501: I/AdapterCursorGrid(20724): -------------------------- 03-08 14:46:49.521: D/AdapterCursorGrid(20724): bindView() Avatar empty... 03-08 14:46:49.521: D/AdapterCursorGrid(20724): bindView() Picture creation... 03-08 14:46:50.320: I/AdapterCursorGrid(20724): newView() 03-08 14:46:51.170: I/AdapterCursorGrid(20724): bindView() 03-08 14:46:51.180: I/AdapterCursorGrid(20724): -------------------------- 03-08 14:46:51.180: I/AdapterCursorGrid(20724): bindView() Record Id: 1 03-08 14:46:51.180: I/AdapterCursorGrid(20724): bindView() Cursor Position: 0 03-08 14:46:51.190: I/AdapterCursorGrid(20724): bindView() View Type: 0 03-08 14:46:51.190: I/AdapterCursorGrid(20724): -------------------------- 03-08 14:46:51.190: D/AdapterCursorGrid(20724): bindView() Avatar empty... 03-08 14:46:51.200: D/AdapterCursorGrid(20724): bindView() Picture creation... 03-08 14:46:51.870: I/AdapterCursorGrid(20724): bindView() 03-08 14:46:51.896: I/AdapterCursorGrid(20724): -------------------------- 03-08 14:46:51.896: I/AdapterCursorGrid(20724): bindView() Record Id: 1 03-08 14:46:51.900: I/AdapterCursorGrid(20724): bindView() Cursor Position: 0 03-08 14:46:51.900: I/AdapterCursorGrid(20724): bindView() View Type: 0 03-08 14:46:51.900: I/AdapterCursorGrid(20724): -------------------------- 03-08 14:46:51.900: D/AdapterCursorGrid(20724): bindView() Avatar empty... 03-08 14:46:51.900: D/AdapterCursorGrid(20724): bindView() Picture creation... ``` The "Avatar empty..." and "Picture creation..." is simply debug that tells me it is processing and updating 2 particular `ImageView`s. Why o why is `bindView` running so many times? What are the reasons for this and what can I do to resolve this? Logically speaking I expect `bindView` to run once (and once each time the adapter is updated), am I wrong in thinking this?