Now we are going to code the smooth scrolling of our Android ListView. In the previous post, we tried to understand how the ListView with adapter works. This time, it will be all about performance.
I did this a separate post because Android ListView is difficult to understand at times. What I have in mind is, "we have to do the basics first, and then apply the optimization."
What's with the ViewHolder pattern?
The ViewHolder design pattern enables you to access each list item view without the need for the look up, saving valuable processor cycles. Specifically, it avoids frequent call of findViewById() during ListView scrolling, and that will make it smooth.
Without the ViewHolder Design Pattern
Okay, let's dig it out and see how it works without the ViewHolder pattern.
Let's take a look at our previous getView() method in ArrayAdapterItem.java
1. The first time it was loaded, convertView is null. We'll have to inflate our list item layout and find the TextView via findViewById().
2. The second time it was loaded, convertView is not null, good! We don't have to inflate it again. But we'll use findViewById() again.
3. The following times it was loaded, convertView is definitely not null. But findViewById() is constantly called, it will work but, it slows down the performance especially if you have lots of items and Views in your ListView.
With the ViewHolder Design Pattern
Now let's see how it works with the ViewHolder pattern.
1. The first time it was loaded, convertView is null. We'll have to inflate our list item layout, instantiate the ViewHolder, find the TextView via findViewById() and assign it to the ViewHolder, and set the ViewHolder as tag of convertView.
2. The second time it was loaded, convertView is not null, good! We don't have to inflate it again. And here's the sweet thing, we won't have to call findViewById() since we can now access the TextView via its ViewHolder.
3. The following time it was loaded, convertView is definitely not null. The findViewById() is never called again, and that makes our smooth ListView scrolling.
So here it is, we'll make use of the Android ViewHolder pattern in our ListView (in just 3 steps!).
Step 1: Add the following static class on our ArrayAdapterItem.java file
Step 2: Our getView() will now look like this:
Step 3: For the sake of testing, we're going to put thousands of items in our ListView. On our MainActivity.java, our showPopUp() will now look like this:
I tested this code with as much as 2,000 items, and the performance is still smooth and great.
If you have other ideas regarding this topic, please drop it in the comment section below. I'm more than willing to update this post and improve the life of mankind.
In the next post, we'll try to use the AsyncTask to load image into the ListView. Something like how the Google Play Store app does it.
For FREE programming tutorials, click the red button below and subscribe! :)