180df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn/* 280df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn * Copyright (C) 2012 The Android Open Source Project 380df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn * 480df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 580df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn * you may not use this file except in compliance with the License. 680df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn * You may obtain a copy of the License at 780df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn * 880df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 980df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn * 1080df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 1180df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 1280df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1380df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn * See the License for the specific language governing permissions and 1480df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn * limitations under the License. 1580df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn */ 1680df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn 1780df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackbornpackage com.example.android.apis.app; 1880df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn 19613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackbornimport com.example.android.apis.app.LoaderCursor.CursorLoaderListFragment.MySearchView; 20613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn 2180df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackbornimport android.app.Activity; 2280df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackbornimport android.app.FragmentManager; 2380df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackbornimport android.app.ListFragment; 2480df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackbornimport android.app.LoaderManager; 25613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackbornimport android.content.Context; 2680df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackbornimport android.content.CursorLoader; 2780df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackbornimport android.content.Loader; 2880df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackbornimport android.database.Cursor; 2980df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackbornimport android.net.Uri; 3080df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackbornimport android.os.Bundle; 3180df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackbornimport android.provider.ContactsContract.Contacts; 3280df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackbornimport android.text.TextUtils; 3380df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackbornimport android.util.Log; 3480df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackbornimport android.view.Menu; 3580df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackbornimport android.view.MenuInflater; 3680df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackbornimport android.view.MenuItem; 3780df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackbornimport android.view.View; 3880df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackbornimport android.widget.ListView; 3980df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackbornimport android.widget.SearchView; 4080df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackbornimport android.widget.SimpleCursorAdapter; 41613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackbornimport android.widget.SearchView.OnCloseListener; 4280df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackbornimport android.widget.SearchView.OnQueryTextListener; 4380df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn 4480df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn/** 4580df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn * Demonstration of the use of a CursorLoader to load and display contacts 4680df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn * data in a fragment. 4780df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn */ 4880df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackbornpublic class LoaderRetained extends Activity { 4980df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn 5080df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn @Override 5180df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn protected void onCreate(Bundle savedInstanceState) { 5280df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn super.onCreate(savedInstanceState); 5380df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn 5480df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn FragmentManager fm = getFragmentManager(); 5580df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn 5680df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn // Create the list fragment and add it as our sole content. 5780df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn if (fm.findFragmentById(android.R.id.content) == null) { 5880df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn CursorLoaderListFragment list = new CursorLoaderListFragment(); 5980df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn fm.beginTransaction().add(android.R.id.content, list).commit(); 6080df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn } 6180df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn } 6280df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn 6380df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn//BEGIN_INCLUDE(fragment_cursor) 6480df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn public static class CursorLoaderListFragment extends ListFragment 65613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn implements OnQueryTextListener, OnCloseListener, 66613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn LoaderManager.LoaderCallbacks<Cursor> { 6780df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn 6880df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn // This is the Adapter being used to display the list's data. 6980df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn SimpleCursorAdapter mAdapter; 7080df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn 71613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn // The SearchView for doing filtering. 72613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn SearchView mSearchView; 73613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn 7480df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn // If non-null, this is the current filter the user has provided. 7580df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn String mCurFilter; 7680df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn 7780df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn @Override public void onActivityCreated(Bundle savedInstanceState) { 7880df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn super.onActivityCreated(savedInstanceState); 7980df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn 8080df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn // In this sample we are going to use a retained fragment. 8180df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn setRetainInstance(true); 8280df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn 8380df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn // Give some text to display if there is no data. In a real 8480df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn // application this would come from a resource. 8580df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn setEmptyText("No phone numbers"); 8680df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn 8780df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn // We have a menu item to show in action bar. 8880df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn setHasOptionsMenu(true); 8980df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn 9080df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn // Create an empty adapter we will use to display the loaded data. 9180df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn mAdapter = new SimpleCursorAdapter(getActivity(), 9280df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn android.R.layout.simple_list_item_2, null, 9380df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn new String[] { Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS }, 9480df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn new int[] { android.R.id.text1, android.R.id.text2 }, 0); 9580df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn setListAdapter(mAdapter); 9680df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn 9780df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn // Start out with a progress indicator. 9880df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn setListShown(false); 9980df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn 10080df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn // Prepare the loader. Either re-connect with an existing one, 10180df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn // or start a new one. 10280df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn getLoaderManager().initLoader(0, null, this); 10380df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn } 10480df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn 105613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn public static class MySearchView extends SearchView { 106613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn public MySearchView(Context context) { 107613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn super(context); 108613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn } 109613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn 110613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn // The normal SearchView doesn't clear its search text when 111613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn // collapsed, so we will do this for it. 112613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn @Override 113613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn public void onActionViewCollapsed() { 114613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn setQuery("", false); 115613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn super.onActionViewCollapsed(); 116613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn } 117613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn } 118613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn 11980df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 12080df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn // Place an action bar item for searching. 12180df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn MenuItem item = menu.add("Search"); 12280df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn item.setIcon(android.R.drawable.ic_menu_search); 12380df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM 12480df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); 125613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn mSearchView = new MySearchView(getActivity()); 126613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn mSearchView.setOnQueryTextListener(this); 127613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn mSearchView.setOnCloseListener(this); 128613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn mSearchView.setIconifiedByDefault(true); 129613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn item.setActionView(mSearchView); 13080df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn } 13180df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn 13280df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn public boolean onQueryTextChange(String newText) { 13380df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn // Called when the action bar search text has changed. Update 13480df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn // the search filter, and restart the loader to do a new query 13580df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn // with this filter. 13680df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn String newFilter = !TextUtils.isEmpty(newText) ? newText : null; 13780df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn // Don't do anything if the filter hasn't actually changed. 13880df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn // Prevents restarting the loader when restoring state. 13980df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn if (mCurFilter == null && newFilter == null) { 14080df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn return true; 14180df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn } 14280df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn if (mCurFilter != null && mCurFilter.equals(newFilter)) { 14380df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn return true; 14480df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn } 14580df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn mCurFilter = newFilter; 14680df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn getLoaderManager().restartLoader(0, null, this); 14780df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn return true; 14880df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn } 14980df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn 15080df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn @Override public boolean onQueryTextSubmit(String query) { 15180df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn // Don't care about this. 15280df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn return true; 15380df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn } 15480df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn 155613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn @Override 156613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn public boolean onClose() { 157613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn if (!TextUtils.isEmpty(mSearchView.getQuery())) { 158613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn mSearchView.setQuery(null, true); 159613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn } 160613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn return true; 161613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn } 162613e19b74072896464e1980d84dc27c2a9f4471aDianne Hackborn 16380df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn @Override public void onListItemClick(ListView l, View v, int position, long id) { 16480df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn // Insert desired behavior here. 16580df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn Log.i("FragmentComplexList", "Item clicked: " + id); 16680df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn } 16780df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn 16880df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn // These are the Contacts rows that we will retrieve. 16980df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] { 17080df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn Contacts._ID, 17180df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn Contacts.DISPLAY_NAME, 17280df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn Contacts.CONTACT_STATUS, 17380df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn Contacts.CONTACT_PRESENCE, 17480df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn Contacts.PHOTO_ID, 17580df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn Contacts.LOOKUP_KEY, 17680df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn }; 17780df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn 17880df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn public Loader<Cursor> onCreateLoader(int id, Bundle args) { 17980df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn // This is called when a new Loader needs to be created. This 18080df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn // sample only has one Loader, so we don't care about the ID. 18180df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn // First, pick the base URI to use depending on whether we are 18280df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn // currently filtering. 18380df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn Uri baseUri; 18480df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn if (mCurFilter != null) { 18580df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI, 18680df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn Uri.encode(mCurFilter)); 18780df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn } else { 18880df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn baseUri = Contacts.CONTENT_URI; 18980df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn } 19080df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn 19180df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn // Now create and return a CursorLoader that will take care of 19280df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn // creating a Cursor for the data being displayed. 19380df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn String select = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND (" 19480df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn + Contacts.HAS_PHONE_NUMBER + "=1) AND (" 19580df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn + Contacts.DISPLAY_NAME + " != '' ))"; 19680df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn return new CursorLoader(getActivity(), baseUri, 19780df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn CONTACTS_SUMMARY_PROJECTION, select, null, 19880df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"); 19980df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn } 20080df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn 20180df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 20280df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn // Swap the new cursor in. (The framework will take care of closing the 20380df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn // old cursor once we return.) 20480df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn mAdapter.swapCursor(data); 20580df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn 20680df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn // The list should now be shown. 20780df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn if (isResumed()) { 20880df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn setListShown(true); 20980df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn } else { 21080df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn setListShownNoAnimation(true); 21180df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn } 21280df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn } 21380df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn 21480df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn public void onLoaderReset(Loader<Cursor> loader) { 21580df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn // This is called when the last Cursor provided to onLoadFinished() 21680df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn // above is about to be closed. We need to make sure we are no 21780df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn // longer using it. 21880df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn mAdapter.swapCursor(null); 21980df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn } 22080df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn } 22180df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn//END_INCLUDE(fragment_cursor) 22280df91c7f2ac155c1cf4c3337f8db5a4bf5426b5Dianne Hackborn} 223