1,loader的概念
2,loader的特点:
- >异步加载数据
2,loader的特点:
- 1.对每一个Activity或fragment都有效
- 2.提供异步加载数据的机制
- 3.监视数据源的变化,并针对变化返回一个新的结果
- 4.由于配置发生变化而重新被创建后,它们会自动重新连接到上一个加载器的游标,所以不必重新查询数据
3,loader的使用步骤
- 创建loadermanager的对象
- 实现loaderCallbacks<>接口里的方法
- 在onCreateLoader中异步下载数据
- 在onLoaderFinish中更新数据
-
重启或关闭loader,使用onloaderReset
实例:
实现效果
逻辑代码:
package com.example.week4_day1_loderdemo;
import android.net.Uri;
import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.LoaderManager;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.ContentResolver;
import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.SearchView.OnQueryTextListener;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;
/**
* 1 声明loaderManager,并得到loader管理者对象
* 2 继承loaderCallbacks<>接口
* 3 实现接口里的方法
*
*/
@SuppressLint("NewApi")
public class MainActivity extends Activity implements LoaderCallbacks<Cursor> {
private ListView lv;
private TextView tv;
private SimpleCursorAdapter adapter = null;
//private ContentResolver resolver;
private LoaderManager manager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
tv = (TextView) findViewById(R.id.tv);
// 得到解析者对象
//resolver = getContentResolver();
// 得到loader管理者对象
manager = getLoaderManager();
/**
* 参数1:loader的唯一标识, 参数2:要传的参数给loader对象, 参数3:回调接口,
* 如果loader的id存在,则使用最后一个,没有则创建一个
*/
manager.initLoader(1, null, this);
// flag:标记,时刻观察数据变化
adapter = new SimpleCursorAdapter(MainActivity.this, R.layout.item,
null, new String[]{"_id","display_name"}, new int[]{R.id.tv1,R.id.tv2},
SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
lv.setAdapter(adapter);
// 没有数据时界面默认显示view
lv.setEmptyView(tv);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
MenuItem item=menu.findItem(R.id.item_search);
SearchView searchView=(SearchView) item.getActionView();
searchView.setOnQueryTextListener(new OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String arg0) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
Bundle bundle=new Bundle();
bundle.putString("key", newText);
getLoaderManager().restartLoader(1, bundle, MainActivity.this);
return false;
}
});
return true;
}
/**
* 根据指定的loader id 创建loader对象
*/
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
//获取联系人的uri
String uri="content://com.android.contacts/raw_contacts";
if(args!=null){
String str = args.getString("key");
/**
* 参数1:上下文,
* 参数2:Contentprovider对象 uri 参数,
* 3:要查询的字段数组,
* 参数4:查询的条件,
* 参数5:查询条件的值,
* 参数6:排序
*/
return new CursorLoader(MainActivity.this, Uri.parse(uri),
new String[] { "_id", "display_name" }, "display_name like ?",
new String[]{str+"%"}, null);
}
return new CursorLoader(MainActivity.this, Uri.parse(uri),
new String[] { "_id", "display_name" }, null, null, null);
}
/**
* loader加载完毕调用此方法 更新 ui 数据, 参数1:当前加载完的loader对象, 参数2:加载完之后的数据
*/
@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor data) {
// TODO Auto-generated method stub
adapter.swapCursor(data);
}
/**
* loader重启或者退出时 调用此方法
*/
@Override
public void onLoaderReset(Loader<Cursor> arg0) {
// TODO Auto-generated method stub
adapter.swapCursor(null);
}
}
布局文件--main
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="没有更多数据了"
android:layout_centerInParent="true"
android:textSize="19sp"
android:textColor="#00ff00"/>
</RelativeLayout>
布局文件--item
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<TextView
android:id="@+id/tv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:textSize="18sp"
android:textColor="#ff0000"/>
<TextView
android:id="@+id/tv2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:textSize="18sp"
android:textColor="#0000ff"/>
</LinearLayout>
菜单文件--menu
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/item_search"
android:orderInCategory="100"
android:showAsAction="always"
android:title="@string/action_settings"
android:actionViewClass="android.widget.SearchView"
/>
</menu>