使用CursorAdpter可以实现,对数据库的监视,当数据库发生变化的时候,自动刷新数据显示。
首先实现CursorAdapter
package com.example.test_ipod_demo.db; import com.example.test_ipod_demo.R; import android.content.Context; import android.database.Cursor; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.CursorAdapter; import android.widget.TextView; public class MyCursorAdapter extends CursorAdapter { public MyCursorAdapter(Context context, Cursor c, boolean autoRequery) { super(context, c, autoRequery); // TODO Auto-generated constructor stub } // 为视图填充数据 @Override public void bindView(View view, Context context, Cursor cursor) { // TODO Auto-generated method stub System.out.println("----bindView-----"); TextView textView=(TextView) view.findViewById(R.id.textView_foot); textView.setText(Utils.getBean(cursor).getSourceString()); } // 创建视图 @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { // TODO Auto-generated method stub System.out.println("-----newView----"); View view=LayoutInflater.from(context).inflate(R.layout.layout_search_listview, null); return view; } }
cursorAdapter=new MyCursorAdapter(this, null, false); listViewSearch.setAdapter(cursorAdapter);
@Override
public boolean onQueryTextChange(String newText) {
if (newText.isEmpty()) {
getLoaderManager().getLoader(0).reset();//清空数据 回调 onLoaderReset方法 但是貌似好像 这个方法没有回调,呵呵
MainActivity.this.findViewById(R.id.textView_listview_empty).setVisibility(View.GONE);
return false;
}
Bundle bundle=new Bundle();
bundle.putString("key", newText);
//重新加载数据 0 加载器标识
getLoaderManager().restartLoader(0, bundle, loaderCallbacks);
return false;
}
private LoaderCallbacks<Cursor> loaderCallbacks=new LoaderCallbacks<Cursor>() { @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { // TODO Auto-generated method stub System.out.println("-----onCreateLoader-----"); if (args==null) { System.out.println("---onCreateLoader---null--"); return null; } SongInfoBean songInfoBean = Utils.getQueryBean( args.getString("key")); CursorLoader cursorLoader=null; if (songInfoBean.isHasHanzi()) {// 中文 或者 含有其他字符的全段匹配 cursorLoader=new CursorLoader(MainActivity.this, Uri.parse("content://"+MyDBProvider.AUTHORITY+"/"+MyDBHelper.TABLE_SONG), null, MyDBHelper.ZH_NAME + " like '%" + songInfoBean.getSourceString() + "%' " + " order by fir_name DESC" + " limit 50 ", null, null); } else { cursorLoader=new CursorLoader(MainActivity.this, Uri.parse("content://"+MyDBProvider.AUTHORITY+"/"+MyDBHelper.TABLE_SONG), null, MyDBHelper.EN_PINYIN_NAME + " like '%" + songInfoBean.getTargetString().trim()+ "%' " + " or " + MyDBHelper.FIR_NAME + " like '%" + songInfoBean.getFirNameString() + "%' " + " order by fir_name DESC" + " limit 50 ", null, null); } return cursorLoader; } @Override public void onLoadFinished(Loader<Cursor> arg0, Cursor cursor) { // TODO Auto-generated method stub System.out.println("-----onLoadFinished-----"); //更新Cursor cursorAdapter.swapCursor(cursor); } @Override public void onLoaderReset(Loader<Cursor> arg0) { // TODO Auto-generated method stub System.out.println("-----onLoaderReset-----"); //重置,清空数据 cursorAdapter.swapCursor(null); } };
这样,当搜索框输入条件发生变化是,就会重新启动加载器去查询数据,然后更新关联的 Cursor