This demo demonstrates the use of class loader. About the use of class loader we have already introduced in the previous demo in this again small review.
Steps for using the class loader:
* 1. Get the class loader manager Loadermanager manager = Tent.getloadermanager ();
* 2. Initialize Loader
Mainactivity
Public class mainactivity extends Activity { @Override protected void onCreate(Bundle savedinstancestate) {Super. OnCreate (Savedinstancestate); Fragmentmanager fm = Getfragmentmanager ();//infer that if the view is not loaded in the activity, create a new view and load if(Fm.findfragmentbyid (Android). r.id.content) = =NULL) {Cursorloaderlistfragment FRG =NewCursorloaderlistfragment (); Fm.begintransaction (). Add (Android. R.id.content, FRG). commit (); } } Public class cursorloaderlistfragment extends listfragment implements Onquerytextlistener, oncloselistener { PrivateSimplecursoradapter Madapter;PrivateMysearchview Mysearchview;PrivateString Mcurrentfilter;@Override Public void onactivitycreated(Bundle savedinstancestate) {Super. onactivitycreated (Savedinstancestate);When the query result is empty, the display prompts are set when no content is displayed in the ListViewSetemptytext ("No phone numbers!");//Set display ActionbarSethasoptionsmenu (true); Madapter =NewSimplecursoradapter (Getactivity (), Android. R.layout.simple_list_item_2,NULL,NewString[] {contacts.display_name, contacts.contact_status},New int[] {Android. R.id.text1, Android. R.ID.TEXT2},0); Setlistadapter (Madapter);//The list is not displayed at this time. Because the data is not ready.Setlistshown (false);//Get the Class loader manager and InitializeGetloadermanager (). Initloader (0,NULL, Myloader); }//define what to query Private Finalstring[] Contacts_summary_projection =NewString[] {contacts._id, contacts.display_name, Contacts.contact_status, CONTACTS.CONTACT_PR Esence, contacts.photo_id, Contacts.lookup_key};PrivateLoadercallbacks<cursor> Myloader =NewLoadercallbacks<cursor> () {@Override PublicLoader<cursor>Oncreateloader(intID, Bundle args) {Uri baseUri;if(Mcurrentfilter! =NULL) {//Assuming the query condition is not empty, append the query criteria on the original basisBaseUri = Uri.withappendedpath (Contacts.content_filter_uri, Uri.encode (Mcurrentfilter)); }Else{BaseUri = Contacts.content_uri; }//Define query criteriaString selection ="(("+ Contacts.display_name +"Notnull) and ("+ Contacts.has_phone_number +"=1) and ("+ Contacts.display_name +"! =")) ";return NewCursorloader (Getactivity (), BaseUri, Contacts_summary_projection, selection,NULL, Contacts.display_name +"COLLATE localized ASC"); }@Override Public void onloadfinished(loader<cursor> Loader, cursor cursor) {//Load Complete Exchange query resultsMadapter.swapcursor (cursor);//Assume that the load animation is displayed when fragment is in the recovery state, otherwise the load animation is not displayed //Data preparation complete, display list if(Isresumed ()) {Setlistshown (true); }Else{Setlistshownnoanimation (true); } }@Override Public void Onloaderreset(loader<cursor> Loader) {//Reboot the loader first to ensure that the old data is purgedMadapter.swapcursor (NULL); } };//define your own search view Public class mysearchview extends searchview { Public Mysearchview(Context context) {Super(context); }//Under normal circumstances, the Serchview will not empty the contents when it shrinks . //Here we need to rewrite the shrinkage method and empty the content when shrinking @Override Public void onactionviewcollapsed() {//Only update query content does not submit querySetquery ("",false);Super. onactionviewcollapsed (); } }@Override Public void Oncreateoptionsmenu(Menu menu, Menuinflater inflater) {Super. Oncreateoptionsmenu (menu, Inflater); MenuItem item = menu.add ("Search"); Item.seticon (Android. R.drawable.ic_menu_search);//Set how item is displayedItem.setshowasaction (Menuitem.show_as_action_if_room | Menuitem.show_as_action_collapse_action_view); Mysearchview =NewMysearchview (Getactivity ());//monitor changes in query contentMysearchview.setonquerytextlistener ( This); Mysearchview.setoncloselistener ( This);//Set the search box to default to its own active zoom out iconMysearchview.seticonifiedbydefault (true);//Set the action view of item and just display the small icon before pressing. Press to expand the displayItem.setactionview (Mysearchview); }@Override Public Boolean Onquerytextsubmit(String query) {//Do not care whether or not to submit. Processing has been made when the contents of the query have changed return true; }@Override Public Boolean Onquerytextchange(String NewText) {String Newfilter =! Textutils.isempty (NewText)?NewText: null; //When the query condition does not change, do not do whatever it is, just return true.
if(Mcurrentfilter = =NULL&& Newfilter = =NULL) {return true; }if(Mcurrentfilter! =NULL&& mcurrentfilter.equals (Newfilter)) {return true; } mcurrentfilter = Newfilter;//Reboot loaderGetloadermanager (). Restartloader (0,NULL, Myloader);return true; }@Override Public Boolean OnClose() {//Empty the contents of the query if(! Textutils.isempty (Mysearchview.getquery ())) {Mysearchview.setquery (NULL,true); }return true; }@Override Public void Onlistitemclick(ListView L, View V,intPositionLongID) {Super. Onlistitemclick (L, V, position, id); Toast.maketext (Getactivity (),"Item clicked:"+ ID,0). Show (); } }}
Add permissions in the configuration file
<uses-permission android:name="android.permission.READ_CONTACTS"/>
Android Api Demos The way to the Summit (45) loader--> Cursor