Android 开发中,适配器扮演了,非常重要的角色,作为组件与数据的桥梁,我们时常会用到适配器,//思路简明扼要莫说废话,总结,常用的适配器有四种,ArrayAdapter,SimpleAdapter,与数据库操作有关的常用SimpleCursorAdapter,剩下一种就是自定义适配器,自定义适配器在前边的文章中,已经详细概述了,适配器离不开,数据源布局和上下文,其实就是将集合中数据,拆成一条条放置在布局文件中,通过适配器给容器使用
在使用适配器的时候,我们可以自己新建布局对象,也引用系统的,常用的有,android.R.layout.simple_dropdown_item_1line, android.R.layout.simple_spinner_dropdown_item,若数据源是文本的话可以采用这两个布局,当然你也可以自己新建一个 但是不能有外部容器,ArrayAdapter 常用语文本,而SimpleAdapter 可以实现图文混排,可以自行设置布局,和自定义适配器之间数据源不同,自定义适配器数据源可随意,simpleAdapter适配器的数据源需要是盛有map<String,Object>集合的List
simpleCursorAdapter 适配器可以通过游标访问数据库,在使用SqLiteDataBase进行一系列的操作之后 返回值通常是Cursor ,此时可以用来构建,simpleCursor 适配器,最后将适配器给容器,(先给容器设置,最后,通过adapter.swap(simpleCursorAdapter adapter))的方式,更改数据源,此处和List 作为数据源不同,不需要,notify 操作。使用simpleCursorAdapter 适配器自定义布局时,和simpleAdapter 类似,但simpleCursorAdapter 的参数略有不同,new String[]{};数组中存放的是,你需要从数据库中查询的字段名,new int[]{},依旧是存放,自定义布局控件的id 值
需要注意的是,simpleCursorAdapter适配器有六个参数,最后一个flags 为观察者 SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER
package com.example.loaderapp;
import android.app.Activity;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.CursorLoader;
import android.content.Loader;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.support.v4.widget.SimpleCursorAdapter;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.SearchView.OnQueryTextListener;
public class MainActivity extends Activity implements LoaderCallbacks<Cursor>{
/**
* content resolver 在主线程中使用的
*/
private ListView lv;
private SimpleCursorAdapter adapter;
private SearchView search;
private Uri contactUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
private String[] columns = {"_id","display_name","raw_contact_id","data1"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.lv);
search = (SearchView) findViewById(R.id.search);
adapter = new SimpleCursorAdapter(this, R.layout.item_self,null,new String[]
{"display_name","data1"}, new int[]{R.id.tv_name,R.id.tv_phone},
SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
lv.setAdapter(adapter);
getLoaderManager().initLoader(7, null, this);
search.setOnQueryTextListener(new OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
Bundle args = new Bundle();
args.putString("key",newText);
getLoaderManager().restartLoader(7, args, MainActivity.this);
return false;
}
});
}
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
String where = null;
String[] whereArgs = null;
if(args!=null){
String data = args.getString("key");
where = "display_name like ? or data1 like ?";
whereArgs = new String[]{"%"+data+"%","%"+data+"%"};
}
return new CursorLoader(this, contactUri, columns, where, whereArgs, null);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
adapter.swapCursor(data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
adapter.swapCursor(null);
}
}