Home | History | Annotate | Download | only in components
      1 page.title=
      2 parent.title=
      3 parent.link=activities.html
      4 @jd:body
      5 <div id="qv-wrapper">
      6 <div id="qv">
      7     <h2></h2>
      8     <ol>
      9     <li><a href="#summary">Loader API </a></li>
     10     <li><a href="#app"></a>
     11       <ol>
     12         <li><a href="#requirements"></a></li>
     13         <li><a href="#starting"></a></li>
     14         <li><a href="#restarting"></a></li>
     15         <li><a href="#callback">LoaderManager </a></li>
     16       </ol>
     17     </li>
     18     <li><a href="#example"></a>
     19        <ol>
     20          <li><a href="#more_examples"></a></li>
     21         </ol>
     22     </li>
     23   </ol>
     24 
     25   <h2></h2>
     26     <ol>
     27       <li>{@link android.app.LoaderManager}</li>
     28       <li>{@link android.content.Loader}</li>
     29 
     30     </ol>
     31 
     32     <h2></h2>
     33    <ol>
     34      <li> <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LoaderCursor.html">
     35 LoaderCursor</a></li>
     36      <li> <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LoaderThrottle.html">
     37 LoaderThrottle</a></li>
     38    </ol>
     39   </div>
     40 </div>
     41 
     42 <p>Android 3.0 
     43  3 </p>
     44   <ul>
     45     <li> {@link android.app.Activity}  {@link
     46 android.app.Fragment} </li>
     47     <li></li>
     48     <li>
     49 </li>
     50     <li>
     51 
     52 </li>
     53   </ul>
     54 
     55 <h2 id="summary">Loader API </h2>
     56 
     57 <p>
     58 </p>
     59 
     60 <table>
     61   <tr>
     62     <th>/</th>
     63     <th></th>
     64   </tr>
     65   <tr>
     66     <td>{@link android.app.LoaderManager}</td>
     67     <td>1  {@link
     68 android.content.Loader} {@link android.app.Activity}  {@link android.app.Fragment} 
     69  {@link android.app.Activity}  {@link android.app.Fragment} {@link android.content.CursorLoader} 
     70 
     71 
     72 
     73 
     74     <br />
     75     <br />
     76     1 {@link android.app.LoaderManager}  1 {@link android.app.LoaderManager} 
     77 </td>
     78   </tr>
     79   <tr>
     80     <td>{@link android.app.LoaderManager.LoaderCallbacks}</td>
     81     <td> {@link
     82 android.app.LoaderManager}  {@link
     83 android.app.LoaderManager.LoaderCallbacks#onCreateLoader onCreateLoader()}  
     84 </td>
     85   </tr>
     86   <tr>
     87     <td>{@link android.content.Loader}</td>
     88     <td>
     89  {@link
     90 android.content.CursorLoader} 
     91 
     92  </td>
     93   </tr>
     94   <tr>
     95     <td>{@link android.content.AsyncTaskLoader}</td>
     96     <td> {@link android.os.AsyncTask} </td>
     97   </tr>
     98   <tr>
     99     <td>{@link android.content.CursorLoader}</td>
    100     <td>{@link android.content.ContentResolver}  {@link
    101 android.database.Cursor} {@link android.content.AsyncTaskLoader} 
    102  {@link
    103 android.content.Loader}  UI {@link android.content.AsyncTaskLoader} {@link
    104 android.content.ContentProvider}  API  API  
    105 
    106 
    107 
    108 </td>
    109   </tr>
    110 </table>
    111 
    112 <p>
    113 {@link
    114 android.app.LoaderManager}  {@link
    115 android.content.CursorLoader}  {@link android.content.Loader}  {@link
    116 android.app.LoaderManager} 
    117 
    118 </p>
    119 
    120 <h2 id ="app"></h2>
    121 <p>Android 
    122 </p>
    123 <ul>
    124   <li>{@link android.app.Activity}  {@link android.app.Fragment}</li>
    125   <li>{@link android.app.LoaderManager} </li>
    126   <li>{@link
    127 android.content.ContentProvider}  {@link android.content.CursorLoader}{@link android.content.Loader} {@link android.content.AsyncTaskLoader} 
    128 
    129 </li>
    130   <li>{@link android.app.LoaderManager.LoaderCallbacks} 
    131 
    132 </li>
    133 <li>{@link
    134 android.widget.SimpleCursorAdapter} </li>
    135   <li>{@link android.content.CursorLoader} {@link android.content.ContentProvider}  
    136 </li>
    137 </ul>
    138 <h3 id="starting"></h3>
    139 
    140 <p>{@link android.app.LoaderManager}  1  {@link
    141 android.content.Loader}  {@link android.app.Activity}  {@link android.app.Fragment} 
    142 1 {@link
    143 android.app.LoaderManager}  1 </p>
    144 
    145 <p> {@link
    146 android.app.Activity#onCreate onCreate()}  {@link android.app.Fragment#onActivityCreated onActivityCreated()}  {@link android.content.Loader} 
    147 
    148 
    149 </p>
    150 
    151 <pre>// Prepare the loader.  Either re-connect with an existing one,
    152 // or start a new one.
    153 getLoaderManager().initLoader(0, null, this);</pre>
    154 
    155 <p>{@link android.app.LoaderManager#initLoader initLoader()} 
    156 </p>
    157 <ul>
    158   <li> IDID  0 </li>
    159 <li> <code>null</code>
    160 </li>
    161 
    162 <li>{@link android.app.LoaderManager}  {@link android.app.LoaderManager.LoaderCallbacks} 
    163  {@link
    164 android.app.LoaderManager.LoaderCallbacks}  {@code this} 
    165 
    166 </li>
    167 </ul>
    168 <p>{@link android.app.LoaderManager#initLoader initLoader()} 
    169  2 </p>
    170 <ul>
    171   <li>ID 
    172 </li>
    173   <li>ID <em></em>{@link android.app.LoaderManager#initLoader initLoader()}  {@link android.app.LoaderManager.LoaderCallbacks}  {@link android.app.LoaderManager.LoaderCallbacks#onCreateLoader onCreateLoader()} <a href="#onCreateLoader">onCreateLoader</a> 
    174 
    175 
    176 
    177 </li>
    178 </ul>
    179 <p> {@link android.app.LoaderManager.LoaderCallbacks} 
    180 
    181  {@link
    182 android.app.LoaderManager.LoaderCallbacks#onLoadFinished onLoadFinished()} {@link android.app.LoaderManager#initLoader initLoader()} 
    183 
    184 
    185 
    186 <a href="#onLoadFinished">
    187 onLoadFinished</a> </p>
    188 
    189 <p>{@link android.app.LoaderManager#initLoader initLoader()}  {@link android.content.Loader} 
    190 
    191 {@link android.app.LoaderManager} 
    192 {@link android.app.LoaderManager} 
    193 
    194  <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LoaderThrottle.html"> LoaderThrottle</a> 
    195 
    196 {@link
    197 android.app.LoaderManager.LoaderCallbacks} 
    198 
    199 <a href="#callback">LoadManager </a></p>
    200 
    201 <h3 id="restarting"></h3>
    202 
    203 <p> {@link android.app.LoaderManager#initLoader initLoader()}  ID 
    204 
    205 
    206 </p>
    207 
    208 <p>{@link
    209 android.app.LoaderManager#restartLoader restartLoader()}  {@link android.widget.SearchView.OnQueryTextListener} 
    210 
    211 
    212 </p>
    213 
    214 <pre>
    215 public boolean onQueryTextChanged(String newText) {
    216     // Called when the action bar search text has changed.  Update
    217     // the search filter, and restart the loader to do a new query
    218     // with this filter.
    219     mCurFilter = !TextUtils.isEmpty(newText) ? newText : null;
    220     getLoaderManager().restartLoader(0, null, this);
    221     return true;
    222 }</pre>
    223 
    224 <h3 id="callback">LoaderManager </h3>
    225 
    226 <p>{@link android.app.LoaderManager.LoaderCallbacks}  {@link android.app.LoaderManager}  
    227  </p>
    228 <p>{@link android.content.CursorLoader} 
    229  {@link android.app.Activity#onStop
    230 onStop()}  {@link android.app.Activity#onStart onStart()} 
    231 
    232 
    233 {@link android.app.LoaderManager.LoaderCallbacks} 
    234 
    235 </p>
    236 
    237 <p>{@link android.app.LoaderManager.LoaderCallbacks} 
    238 </p>
    239 <ul>
    240   <li>{@link android.app.LoaderManager.LoaderCallbacks#onCreateLoader onCreateLoader()}   ID  {@link android.content.Loader} 
    241 
    242 </li></ul>
    243 <ul>
    244   <li> {@link android.app.LoaderManager.LoaderCallbacks#onLoadFinished onLoadFinished()} 
    245 
    246 </li></ul>
    247 <ul>
    248   <li>{@link android.app.LoaderManager.LoaderCallbacks#onLoaderReset onLoaderReset()}  
    249 
    250 
    251 </li>
    252 </ul>
    253 <p></p>
    254 
    255 <h4 id ="onCreateLoader">onCreateLoader</h4>
    256 
    257 <p>{@link
    258 android.app.LoaderManager#initLoader initLoader()} ID 
    259 {@link
    260 android.app.LoaderManager.LoaderCallbacks}  {@link
    261 android.app.LoaderManager.LoaderCallbacks#onCreateLoader onCreateLoader()} 
    262 {@link
    263 android.content.CursorLoader}  {@link
    264 android.content.Loader}  </p>
    265 
    266 <p>{@link
    267 android.app.LoaderManager.LoaderCallbacks#onCreateLoader onCreateLoader()}
    268   {@link android.content.CursorLoader} {@link android.content.CursorLoader} {@link
    269 android.content.ContentProvider} 
    270 
    271 </p>
    272 <ul>
    273   <li><em>uri</em>   URI </li>
    274   <li><em>projection</em>  <code>null</code> 
    275  </li>
    276   <li><em>selection</em>  SQL WHERE WHERE 
    277 <code>null</code>  URI 
    278  </li>
    279   <li><em>selectionArgs</em>  selection  ? selection  <em>selectionArgs</em> 
    280 
    281 Strings  </li>
    282   <li><em>sortOrder</em>  SQL
    283 ORDER BY ORDER <code>null</code> 
    284 </li>
    285 </ul>
    286 <p></p>
    287 <pre>
    288  // If non-null, this is the current filter the user has provided.
    289 String mCurFilter;
    290 ...
    291 public Loader&lt;Cursor&gt; onCreateLoader(int id, Bundle args) {
    292     // This is called when a new Loader needs to be created. This
    293     // sample only has one Loader, so we don't care about the ID.
    294     // First, pick the base URI to use depending on whether we are
    295     // currently filtering.
    296     Uri baseUri;
    297   if (mCurFilter != null) {
    298     baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI,
    299           Uri.encode(mCurFilter));
    300   } else {
    301     baseUri = Contacts.CONTENT_URI;
    302   }
    303 
    304   // Now create and return a CursorLoader that will take care of
    305   // creating a Cursor for the data being displayed.
    306   String select = &quot;((&quot; + Contacts.DISPLAY_NAME + &quot; NOTNULL) AND (&quot;
    307       + Contacts.HAS_PHONE_NUMBER + &quot;=1) AND (&quot;
    308       + Contacts.DISPLAY_NAME + &quot; != '' ))&quot;;
    309   return new CursorLoader(getActivity(), baseUri,
    310       CONTACTS_SUMMARY_PROJECTION, select, null,
    311       Contacts.DISPLAY_NAME + &quot; COLLATE LOCALIZED ASC&quot;);
    312 }</pre>
    313 <h4 id="onLoadFinished">onLoadFinished</h4>
    314 
    315 <p>
    316 
    317 
    318 
    319 </p>
    320 
    321 
    322 <p>
    323  {@link
    324 android.content.CursorLoader}  {@link
    325 android.database.Cursor#close close()}  {@link android.widget.CursorAdapter}  {@link android.database.Cursor}  {@link
    326 android.widget.SimpleCursorAdapter#swapCursor swapCursor()} 
    327 
    328 </p>
    329 
    330 <pre>
    331 // This is the Adapter being used to display the list's data.<br
    332 />SimpleCursorAdapter mAdapter;
    333 ...
    334 
    335 public void onLoadFinished(Loader&lt;Cursor&gt; loader, Cursor data) {
    336     // Swap the new cursor in. (The framework will take care of closing the
    337     // old cursor once we return.)
    338     mAdapter.swapCursor(data);
    339 }</pre>
    340 
    341 <h4 id="onLoaderReset">onLoaderReset</h4>
    342 
    343 <p>
    344 
    345  </p>
    346 <p><code>null</code>  {@link android.widget.SimpleCursorAdapter#swapCursor swapCursor()} 
    347 
    348 </p>
    349 
    350 <pre>
    351 // This is the Adapter being used to display the list's data.
    352 SimpleCursorAdapter mAdapter;
    353 ...
    354 
    355 public void onLoaderReset(Loader&lt;Cursor&gt; loader) {
    356     // This is called when the last Cursor provided to onLoadFinished()
    357     // above is about to be closed. We need to make sure we are no
    358     // longer using it.
    359     mAdapter.swapCursor(null);
    360 }</pre>
    361 
    362 
    363 <h2 id="example"></h2>
    364 
    365 <p>  {@link android.widget.ListView}  {@link
    366 android.app.Fragment} 
    367 {@link
    368 android.content.CursorLoader} </p>
    369 
    370 <p> {@link android.Manifest.permission#READ_CONTACTS READ_CONTACTS} 
    371 
    372 </p>
    373 
    374 <pre>
    375 public static class CursorLoaderListFragment extends ListFragment
    376     implements OnQueryTextListener, LoaderManager.LoaderCallbacks&lt;Cursor&gt; {
    377 
    378     // This is the Adapter being used to display the list's data.
    379   SimpleCursorAdapter mAdapter;
    380 
    381   // If non-null, this is the current filter the user has provided.
    382   String mCurFilter;
    383 
    384   @Override public void onActivityCreated(Bundle savedInstanceState) {
    385     super.onActivityCreated(savedInstanceState);
    386 
    387     // Give some text to display if there is no data. In a real
    388     // application this would come from a resource.
    389     setEmptyText(&quot;No phone numbers&quot;);
    390 
    391     // We have a menu item to show in action bar.
    392     setHasOptionsMenu(true);
    393 
    394     // Create an empty adapter we will use to display the loaded data.
    395     mAdapter = new SimpleCursorAdapter(getActivity(),
    396         android.R.layout.simple_list_item_2, null,
    397         new String[] { Contacts.DISPLAY_NAME, Contacts.CONTACT_STATUS },
    398         new int[] { android.R.id.text1, android.R.id.text2 }, 0);
    399     setListAdapter(mAdapter);
    400 
    401     // Prepare the loader. Either re-connect with an existing one,
    402     // or start a new one.
    403     getLoaderManager().initLoader(0, null, this);
    404   }
    405 
    406   @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    407     // Place an action bar item for searching.
    408     MenuItem item = menu.add(&quot;Search&quot;);
    409     item.setIcon(android.R.drawable.ic_menu_search);
    410     item.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
    411     SearchView sv = new SearchView(getActivity());
    412     sv.setOnQueryTextListener(this);
    413     item.setActionView(sv);
    414   }
    415 
    416   public boolean onQueryTextChange(String newText) {
    417     // Called when the action bar search text has changed. Update
    418     // the search filter, and restart the loader to do a new query
    419     // with this filter.
    420     mCurFilter = !TextUtils.isEmpty(newText) ? newText : null;
    421     getLoaderManager().restartLoader(0, null, this);
    422     return true;
    423   }
    424 
    425   @Override public boolean onQueryTextSubmit(String query) {
    426     // Don't care about this.
    427     return true;
    428   }
    429 
    430   @Override public void onListItemClick(ListView l, View v, int position, long id) {
    431     // Insert desired behavior here.
    432     Log.i(&quot;FragmentComplexList&quot;, &quot;Item clicked: &quot; + id);
    433   }
    434 
    435   // These are the Contacts rows that we will retrieve.
    436   static final String[] CONTACTS_SUMMARY_PROJECTION = new String[] {
    437     Contacts._ID,
    438     Contacts.DISPLAY_NAME,
    439     Contacts.CONTACT_STATUS,
    440     Contacts.CONTACT_PRESENCE,
    441     Contacts.PHOTO_ID,
    442     Contacts.LOOKUP_KEY,
    443   };
    444   public Loader&lt;Cursor&gt; onCreateLoader(int id, Bundle args) {
    445     // This is called when a new Loader needs to be created. This
    446     // sample only has one Loader, so we don't care about the ID.
    447     // First, pick the base URI to use depending on whether we are
    448     // currently filtering.
    449     Uri baseUri;
    450     if (mCurFilter != null) {
    451       baseUri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI,
    452           Uri.encode(mCurFilter));
    453     } else {
    454       baseUri = Contacts.CONTENT_URI;
    455     }
    456 
    457     // Now create and return a CursorLoader that will take care of
    458     // creating a Cursor for the data being displayed.
    459     String select = &quot;((&quot; + Contacts.DISPLAY_NAME + &quot; NOTNULL) AND (&quot;
    460         + Contacts.HAS_PHONE_NUMBER + &quot;=1) AND (&quot;
    461         + Contacts.DISPLAY_NAME + &quot; != '' ))&quot;;
    462     return new CursorLoader(getActivity(), baseUri,
    463         CONTACTS_SUMMARY_PROJECTION, select, null,
    464         Contacts.DISPLAY_NAME + &quot; COLLATE LOCALIZED ASC&quot;);
    465   }
    466 
    467   public void onLoadFinished(Loader&lt;Cursor&gt; loader, Cursor data) {
    468     // Swap the new cursor in. (The framework will take care of closing the
    469     // old cursor once we return.)
    470     mAdapter.swapCursor(data);
    471   }
    472 
    473   public void onLoaderReset(Loader&lt;Cursor&gt; loader) {
    474     // This is called when the last Cursor provided to onLoadFinished()
    475     // above is about to be closed. We need to make sure we are no
    476     // longer using it.
    477     mAdapter.swapCursor(null);
    478   }
    479 }</pre>
    480 <h3 id="more_examples"></h3>
    481 
    482 <p><strong>ApiDemos</strong> 
    483 </p>
    484 <ul>
    485   <li><a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LoaderCursor.html">
    486 LoaderCursor</a>  
    487 </li>
    488   <li><a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LoaderThrottle.html"> LoaderThrottle</a>   
    489 </li>
    490 </ul>
    491 
    492 <p>SDK <a href="http://developer.android.com/resources/samples/get.html">Getting the Samples</a> 
    493  </p>
    494 
    495