Making ListView Scrolling Smooth

This lesson teaches you to

You should also read

The key to a smoothly scrolling ListView is to keep the application’s main
thread (the UI thread) free from heavy processing. Ensure you do any disk access, network access, or
SQL access in a separate thread. To test the status of your app, you can enable StrictMode.

Use a Background Thread

Using a background thread ("worker thread") removes strain from the main thread so it can focus
on drawing the UI. In many cases, using AsyncTask provides a simple way to
perform your work outside the main thread. AsyncTask automatically queues up all
the execute() requests and performs them serially. This
behavior is global to a particular process and means you don’t need to worry about creating your
own thread pool.

In the sample code below, an AsyncTask is used to load
images in a background thread, then apply them to the UI once finished. It also shows a
progress spinner in place of the images while they are loading.

Beginning with Android 3.0 (API level 11), an extra feature is available in AsyncTask so you can enable it to run across multiple processor cores. Instead of
calling execute() you can specify executeOnExecutor() and multiple requests can be executed at
the same time depending on the number of cores available.

Hold View Objects in a View Holder

Your code might call findViewById() frequently
during the scrolling of ListView, which can slow down performance. Even when
the Adapter returns an inflated view for recycling, you still need to look up the
elements
and update them. A way around repeated use of findViewById() is to use the "view holder" design pattern.

A ViewHolder object stores each of the component views inside the tag field of the
Layout, so you can immediately access them without the need to look them up repeatedly. First, you
need to create a class to hold your exact set of views. For example: