I am trying to understand the ListView concept and how it works and I’m trying to create my own adapter which extends BaseAdapter. For ArrayAdapter for instance, there is the notifyDataSetChanged() method which should be called after you’ve updated the array list which holds all your data, in order to refresh the ListView.
But I am creating my own subclass of BaseAdapter. That method is not available to me, or is it? How do i implement this method? Basically, what does that method do exactly, maybe I’ll understand then.
In case of the ArrayAdapter i’m guessing it looks at what position the ListView is currently displaying and it checks if it’s the same one as in the ArrayList after it was updated? Or…
It says that the method:
Notifies the attached observers that the underlying data has been
changed and any View reflecting the data set should refresh itself.
But how exactly does it refresh itself?
Can someone explain please?
I’ve figured it out. I couldn’t understand how the hell the adapter started and how did it know where to get the data from. When i extended the
BaseAdapterclass, in the constructor of that class I initialized the list of items that I wanted to see in theListView. But I couldn’t figure out how these values would be used and when.So here’s the thing !!! :
In the
BaseAdapterthere are some methods that need to be overridden. Among these, there isgetCount().When the
ListViewis created and whatnot, it callsgetCount(). If this returns a value different than 0 (I returned the size of the ArrayList which I’ve previously initialized in the constructor), then it callsgetView()enough times to fill the screen with items. For instance, I initialized theArrayListwith 20 items. Because only 8 items initially fit on the screen,getView()was called 8 times, each time asking for the position it required for me to return (more precisely it wanted to know how the row would look like in the list on that specific position, what data it needed to contain). If I scroll down the list,getView()gets called over and over again, ’til I hit the end of the list, in my case 20 items / rows.What
notifyDataSetChanged()does is … when called, it looks at what items are displayed on the screen at the moment of its call (more precisely which row indexes ) and callsgetView()with those positions.i.e. if you’re displaying the first 8 items in the list (so those are the ones visible on the screen) and you add another item between the 2nd and 3rd item in the list and you call
notifyDataSetChanged()thengetView()is called 8 times, with positions starting from 0 and ending with 7, and because in thegetView()method you’re getting data from theArrayListthen it will automatically return the new item inserted in the list alongside 7 out of the previous 8 (7 and not 8 because the last item went one position down, so it is not visible anymore), and theListViewwill redraw, or whatever, with these items.Also, important to specify is that if you’ve implemented
getView()correctly, you’ll end up recycling the items (the objects) already displayed (instead of creating new ones). See this video at around 12:00 minutes to see the correct way to implementgetView()I’ve figured all this out by placing calls to
LogCatin every method and following what was going on.P.S. This example also helped me a lot to understand.
UPDATE
Nowadays
ListViewsare not really used anymore. Android came out with theRecyclerViewwhich does the recycling of the views for you, but knowing the basics of aListViewhelps with understanding theRecyclerView.Here’s a link for reference: https://developer.android.com/guide/topics/ui/layout/recyclerview