List View

ListView is a view group that displays a list of
scrollable items. The list items are automatically inserted to the list using an Adapter that pulls content from a source such as an array or database query and
converts each item result into a view that's placed into the list.

Although the CursorLoader APIs were first introduced in
Android 3.0 (API level 11), they are also available in the Support Library so that your app may use them
while supporting devices running Android 1.6 or higher.

For more information about using a Loader to asynchronously load data, see the Loaders guide.

Example

The following example uses ListActivity, which is an activity that includes
a ListView as its only layout element by default. It performs a query to
the Contacts
Provider for a list of names and phone numbers.

The activity implements the LoaderCallbacks interface in order to use a CursorLoader that
dynamically loads the data for the list view.

Kotlin

// These are the Contacts rows that we will retrieve
internal val PROJECTION = arrayOf(
ContactsContract.Data._ID,
ContactsContract.Data.DISPLAY_NAME)
// This is the select criteria
internal const val SELECTION = "((" +
ContactsContract.Data.DISPLAY_NAME + " NOTNULL) AND (" +
ContactsContract.Data.DISPLAY_NAME + " != '' ))"
class ListViewLoader : ListActivity(), LoaderManager.LoaderCallbacks<Cursor> {
// This is the Adapter being used to display the list's data
private lateinit var mAdapter: SimpleCursorAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Create a progress bar to display while the list loads
val progressBar = ProgressBar(this)
progressBar.layoutParams = FrameLayout.LayoutParams(
FrameLayout.LayoutParams.WRAP_CONTENT,
FrameLayout.LayoutParams.WRAP_CONTENT,
Gravity.CENTER)
progressBar.isIndeterminate = true
listView.emptyView = progressBar
// Must add the progress bar to the root of the layout
val root: ViewGroup = findViewById(android.R.id.content)
root.addView(progressBar)
// For the cursor adapter, specify which columns go into which views
val fromColumns: Array<String> = arrayOf(ContactsContract.Data.DISPLAY_NAME)
val toViews = intArrayOf(android.R.id.text1) // The TextView in simple_list_item_1
// Create an empty adapter we will use to display the loaded data.
// We pass null for the cursor, then update it in onLoadFinished()
mAdapter = SimpleCursorAdapter(this,
android.R.layout.simple_list_item_1, null,
fromColumns, toViews, 0)
listAdapter = mAdapter
// Prepare the loader. Either re-connect with an existing one,
// or start a new one.
loaderManager.initLoader(0, null, this)
}
// Called when a new Loader needs to be created
override fun onCreateLoader(id: Int, args: Bundle): Loader<Cursor> {
// Now create and return a CursorLoader that will take care of
// creating a Cursor for the data being displayed.
return CursorLoader(this, ContactsContract.Data.CONTENT_URI,
PROJECTION, SELECTION, null, null)
}
// Called when a previously created loader has finished loading
override fun onLoadFinished(loader: Loader<Cursor>, data: Cursor) {
// Swap the new cursor in. (The framework will take care of closing the
// old cursor once we return.)
mAdapter.swapCursor(data)
}
// Called when a previously created loader is reset, making the data unavailable
override fun onLoaderReset(loader: Loader<Cursor>) {
// This is called when the last Cursor provided to onLoadFinished()
// above is about to be closed. We need to make sure we are no
// longer using it.
mAdapter.swapCursor(null)
}
override fun onListItemClick(l: ListView, v: View, position: Int, id: Long) {
// Do something when a list item is clicked
}
}

Java

public class ListViewLoader extends ListActivity
implements LoaderManager.LoaderCallbacks<Cursor> {
// This is the Adapter being used to display the list's data
SimpleCursorAdapter mAdapter;
// These are the Contacts rows that we will retrieve
static final String[] PROJECTION = new String[] {ContactsContract.Data._ID,
ContactsContract.Data.DISPLAY_NAME};
// This is the select criteria
static final String SELECTION = "((" +
ContactsContract.Data.DISPLAY_NAME + " NOTNULL) AND (" +
ContactsContract.Data.DISPLAY_NAME + " != '' ))";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Create a progress bar to display while the list loads
ProgressBar progressBar = new ProgressBar(this);
progressBar.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT, Gravity.CENTER));
progressBar.setIndeterminate(true);
getListView().setEmptyView(progressBar);
// Must add the progress bar to the root of the layout
ViewGroup root = (ViewGroup) findViewById(android.R.id.content);
root.addView(progressBar);
// For the cursor adapter, specify which columns go into which views
String[] fromColumns = {ContactsContract.Data.DISPLAY_NAME};
int[] toViews = {android.R.id.text1}; // The TextView in simple_list_item_1
// Create an empty adapter we will use to display the loaded data.
// We pass null for the cursor, then update it in onLoadFinished()
mAdapter = new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_1, null,
fromColumns, toViews, 0);
setListAdapter(mAdapter);
// Prepare the loader. Either re-connect with an existing one,
// or start a new one.
getLoaderManager().initLoader(0, null, this);
}
// Called when a new Loader needs to be created
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
// Now create and return a CursorLoader that will take care of
// creating a Cursor for the data being displayed.
return new CursorLoader(this, ContactsContract.Data.CONTENT_URI,
PROJECTION, SELECTION, null, null);
}
// Called when a previously created loader has finished loading
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
// Swap the new cursor in. (The framework will take care of closing the
// old cursor once we return.)
mAdapter.swapCursor(data);
}
// Called when a previously created loader is reset, making the data unavailable
public void onLoaderReset(Loader<Cursor> loader) {
// This is called when the last Cursor provided to onLoadFinished()
// above is about to be closed. We need to make sure we are no
// longer using it.
mAdapter.swapCursor(null);
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
// Do something when a list item is clicked
}
}

Note: Because this sample performs a query on the Contacts
Provider, if you want to
try this code, your app must request the READ_CONTACTS
permission in the manifest file:<uses-permission android:name="android.permission.READ_CONTACTS" />

Content and code samples on this page are subject to the licenses described in the Content License. Java is a registered trademark of Oracle and/or its affiliates.