- 浏览: 30572 次
- 性别:
- 来自: 南京
文章分类
最新评论
-
dolphin0618:
我要把查询出来的数据不只是打印,我要存入变量里,方法是什么
xquery在java中的应用 -
dolphin0618:
你能把XML发一下么
xquery在java中的应用 -
zhuqiang5138:
总感觉自己最近的记忆力不是很好,就觉着应该把学过的东西,现在正 ...
My Android成长之路(一) -
ge_cc:
ge_cc 写道 //这里不知道问什么我之前做的时候 用一个参 ...
jmagick开发 备忘 -
ge_cc:
//这里不知道问什么我之前做的时候 用一个参数的构造函数 怎么 ...
jmagick开发 备忘
CursorAdapter如何实现关键字过滤
2010-12-10 13:13:14| 分类: Android基础 |字号 订阅
android.widget.CursorAdapter
它首先实现了两个接口Filterable,CursorFilter.CursorFilterClient。
其中Filterable接口定义了getFilter()这个接口。
CursorFilterClient定义如下接口:
CharSequence convertToString(Cursor cursor);
Cursor runQueryOnBackgroundThread(CharSequence constraint);
Cursor getCursor();
void changeCursor(Cursor cursor);
注意:CursorFilter.CursorFilterClient是非public的,所以只有文档中看不到它,在源码中才能看到它。
CursorAdapter.java文件如下
package android.widget;
-----------------------------------省略---------------------------------
public abstract class CursorAdapter extends BaseAdapter implements Filterable,
CursorFilter.CursorFilterClient {
/**
* This field should be made private, so it is hidden from the SDK.
* {@hide}
*/
protected boolean mDataValid;
/**
* This field should be made private, so it is hidden from the SDK.
* {@hide}
*/
protected boolean mAutoRequery;
/**
* This field should be made private, so it is hidden from the SDK.
* {@hide}
*/
protected Cursor mCursor;
-----------------------------------省略---------------------------------
protected CursorFilter mCursorFilter;
/**
* This field should be made private, so it is hidden from the SDK.
* {@hide}
*/
protected FilterQueryProvider mFilterQueryProvider;
-----------------------------------省略---------------------------------
public Cursor getCursor() {
return mCursor;
}
-----------------------------------省略---------------------------------
public void changeCursor(Cursor cursor) {
-----------------------------------省略---------------------------------
}
-----------------------------------省略---------------------------------
public CharSequence convertToString(Cursor cursor) {
return cursor == null ? "" : cursor.toString();
}
-----------------------------------省略---------------------------------
public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
if (mFilterQueryProvider != null) {
return mFilterQueryProvider.runQuery(constraint);
}
return mCursor;
}
public Filter getFilter() {
if (mCursorFilter == null) {
mCursorFilter = new CursorFilter(this);
}
return mCursorFilter;
}
-----------------------------------省略---------------------------------
public FilterQueryProvider getFilterQueryProvider() {
return mFilterQueryProvider;
}
-----------------------------------省略---------------------------------
public void setFilterQueryProvider(FilterQueryProvider filterQueryProvider) {
mFilterQueryProvider = filterQueryProvider;
}
-----------------------------------省略---------------------------------
}
CursorFilter文件如下:
package android.widget;
import android.database.Cursor;
class CursorFilter extends Filter {
CursorFilterClient mClient;
interface CursorFilterClient {
CharSequence convertToString(Cursor cursor);
Cursor runQueryOnBackgroundThread(CharSequence constraint);
Cursor getCursor();
void changeCursor(Cursor cursor);
}
CursorFilter(CursorFilterClient client) {
mClient = client;
}
@Override
public CharSequence convertResultToString(Object resultValue) {
return mClient.convertToString((Cursor) resultValue);
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
Cursor cursor = mClient.runQueryOnBackgroundThread(constraint);
FilterResults results = new FilterResults();
if (cursor != null) {
results.count = cursor.getCount();
results.values = cursor;
} else {
results.count = 0;
results.values = null;
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
Cursor oldCursor = mClient.getCursor();
if (results.values != null && results.values != oldCursor) {
mClient.changeCursor((Cursor) results.values);
}
}
}
关于Filter的更多内容参见《关键字过滤器Filter》。
如何使用Filter呢?
调用CursorAdapter的getFilter方法得到一个Filter,调用它的filter (CharSequence constraint)方法。其中constraint就是关键字。
注意1:如果不给CursorAdapter设置FilterQueryProvider(通过setFilterQueryProvider方法),
那么就需要重载Cursor runQueryOnBackgroundThread(CharSequence constraint)来实现对数据库的过滤查询。
当然FilterQueryProvider其实就是在它唯一的方法public abstract Cursor runQuery (CharSequence constraint)里面实现对数据库的过滤查询。
参考源代码可以知道如果提供了FilterQueryProvider,那么CursorAdapter就是在runQueryOnBackgroundThread方法中直接调用FilterQueryProvider的runQuery方法来进行数据库的过滤查询
如何使用Filter呢?
调用CursorAdapter的getFilter方法得到一个Filter,调用它的filter (CharSequence constraint)方法。其中constraint就是关键字。
注意1:如果不给CursorAdapter设置FilterQueryProvider(通过setFilterQueryProvider方法),
那么就需要重载Cursor runQueryOnBackgroundThread(CharSequence constraint)来实现对数据库的过滤查询。
当然FilterQueryProvider其实就是在它唯一的方法public abstract Cursor runQuery (CharSequence constraint)里面实现对数据库的过滤查询。
参考源代码可以知道如果提供了FilterQueryProvider,那么CursorAdapter就是在runQueryOnBackgroundThread方法中直接调用FilterQueryProvider的runQuery方法来进行数据库的过滤查询
/***
* AndroidManifest.xml
*
<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>
/***
* AutoMultipleContacts.java
*
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.Contacts;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import android.widget.Filterable;
import android.widget.MultiAutoCompleteTextView;
import android.widget.TextView;
public class AutoMultipleContacts extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.multipleselect);
Cursor peopleCursor = getContentResolver().query(Contacts.People.CONTENT_URI, PEOPLE_PROJECTION, null, null, Contacts.People.DEFAULT_SORT_ORDER);
ContactListAdapter contactadapter = new ContactListAdapter(this,peopleCursor);
MultiAutoCompleteTextView textView = (MultiAutoCompleteTextView) findViewById(R.id.contacts);
textView.setAdapter(contactadapter);
textView.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());
}
public static class ContactListAdapter extends CursorAdapter implements Filterable {
public ContactListAdapter(Context context, Cursor c) {
super(context, c);
mContent = context.getContentResolver();
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
final LayoutInflater inflater = LayoutInflater.from(context);
final TextView view = (TextView) inflater.inflate(
android.R.layout.simple_dropdown_item_1line, parent, false);
view.setText(cursor.getString(5));
return view;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
((TextView) view).setText(cursor.getString(5));
}
@Override
public String convertToString(Cursor cursor) {
return cursor.getString(5);
}
@Override
public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
if (getFilterQueryProvider() != null) {
return getFilterQueryProvider().runQuery(constraint);
}
StringBuilder buffer = null;
String[] args = null;
if (constraint != null) {
buffer = new StringBuilder();
buffer.append(\"UPPER(\");
buffer.append(Contacts.ContactMethods.NAME);
buffer.append(\") GLOB ?\");
args = new String[] { constraint.toString().toUpperCase() + \"*\" };
}
return mContent.query(Contacts.People.CONTENT_URI, PEOPLE_PROJECTION,
buffer == null ? null : buffer.toString(), args,
Contacts.People.DEFAULT_SORT_ORDER);
}
private ContentResolver mContent;
}
private static final String[] PEOPLE_PROJECTION = new String[] {
Contacts.People._ID,
Contacts.People.PRIMARY_PHONE_ID,
Contacts.People.TYPE,
Contacts.People.NUMBER,
Contacts.People.LABEL,
Contacts.People.NAME,
};
}
/***
* res/layout/multipleselect.xml
*
<?xml version=\"1.0\" encoding=\"utf-8\"?>
<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"
android:orientation=\"vertical\"
android:layout_width=\"fill_parent\"
android:layout_height=\"fill_parent\"
>
<LinearLayout
android:layout_width=\"fill_parent\"
android:layout_height=\"wrap_content\"
android:gravity=\"center_vertical\">
<MultiAutoCompleteTextView
android:id=\"@+id/contacts\"
android:textSize=\"18sp\"
android:layout_margin=\"8px\"
android:layout_width=\"0px\"
android:layout_height=\"wrap_content\"
android:layout_weight=\"1\" />
</LinearLayout>
</LinearLayout>
关于这方面的知识,还可以参见下面两篇文章:
http://blog.csdn.net/dragondog/article/details/6234052
http://hubingforever.blog.163.com/blog/static/1710405792010111011314506/
2010-12-10 13:13:14| 分类: Android基础 |字号 订阅
android.widget.CursorAdapter
它首先实现了两个接口Filterable,CursorFilter.CursorFilterClient。
其中Filterable接口定义了getFilter()这个接口。
CursorFilterClient定义如下接口:
CharSequence convertToString(Cursor cursor);
Cursor runQueryOnBackgroundThread(CharSequence constraint);
Cursor getCursor();
void changeCursor(Cursor cursor);
注意:CursorFilter.CursorFilterClient是非public的,所以只有文档中看不到它,在源码中才能看到它。
CursorAdapter.java文件如下
package android.widget;
-----------------------------------省略---------------------------------
public abstract class CursorAdapter extends BaseAdapter implements Filterable,
CursorFilter.CursorFilterClient {
/**
* This field should be made private, so it is hidden from the SDK.
* {@hide}
*/
protected boolean mDataValid;
/**
* This field should be made private, so it is hidden from the SDK.
* {@hide}
*/
protected boolean mAutoRequery;
/**
* This field should be made private, so it is hidden from the SDK.
* {@hide}
*/
protected Cursor mCursor;
-----------------------------------省略---------------------------------
protected CursorFilter mCursorFilter;
/**
* This field should be made private, so it is hidden from the SDK.
* {@hide}
*/
protected FilterQueryProvider mFilterQueryProvider;
-----------------------------------省略---------------------------------
public Cursor getCursor() {
return mCursor;
}
-----------------------------------省略---------------------------------
public void changeCursor(Cursor cursor) {
-----------------------------------省略---------------------------------
}
-----------------------------------省略---------------------------------
public CharSequence convertToString(Cursor cursor) {
return cursor == null ? "" : cursor.toString();
}
-----------------------------------省略---------------------------------
public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
if (mFilterQueryProvider != null) {
return mFilterQueryProvider.runQuery(constraint);
}
return mCursor;
}
public Filter getFilter() {
if (mCursorFilter == null) {
mCursorFilter = new CursorFilter(this);
}
return mCursorFilter;
}
-----------------------------------省略---------------------------------
public FilterQueryProvider getFilterQueryProvider() {
return mFilterQueryProvider;
}
-----------------------------------省略---------------------------------
public void setFilterQueryProvider(FilterQueryProvider filterQueryProvider) {
mFilterQueryProvider = filterQueryProvider;
}
-----------------------------------省略---------------------------------
}
CursorFilter文件如下:
package android.widget;
import android.database.Cursor;
class CursorFilter extends Filter {
CursorFilterClient mClient;
interface CursorFilterClient {
CharSequence convertToString(Cursor cursor);
Cursor runQueryOnBackgroundThread(CharSequence constraint);
Cursor getCursor();
void changeCursor(Cursor cursor);
}
CursorFilter(CursorFilterClient client) {
mClient = client;
}
@Override
public CharSequence convertResultToString(Object resultValue) {
return mClient.convertToString((Cursor) resultValue);
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
Cursor cursor = mClient.runQueryOnBackgroundThread(constraint);
FilterResults results = new FilterResults();
if (cursor != null) {
results.count = cursor.getCount();
results.values = cursor;
} else {
results.count = 0;
results.values = null;
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
Cursor oldCursor = mClient.getCursor();
if (results.values != null && results.values != oldCursor) {
mClient.changeCursor((Cursor) results.values);
}
}
}
关于Filter的更多内容参见《关键字过滤器Filter》。
如何使用Filter呢?
调用CursorAdapter的getFilter方法得到一个Filter,调用它的filter (CharSequence constraint)方法。其中constraint就是关键字。
注意1:如果不给CursorAdapter设置FilterQueryProvider(通过setFilterQueryProvider方法),
那么就需要重载Cursor runQueryOnBackgroundThread(CharSequence constraint)来实现对数据库的过滤查询。
当然FilterQueryProvider其实就是在它唯一的方法public abstract Cursor runQuery (CharSequence constraint)里面实现对数据库的过滤查询。
参考源代码可以知道如果提供了FilterQueryProvider,那么CursorAdapter就是在runQueryOnBackgroundThread方法中直接调用FilterQueryProvider的runQuery方法来进行数据库的过滤查询
如何使用Filter呢?
调用CursorAdapter的getFilter方法得到一个Filter,调用它的filter (CharSequence constraint)方法。其中constraint就是关键字。
注意1:如果不给CursorAdapter设置FilterQueryProvider(通过setFilterQueryProvider方法),
那么就需要重载Cursor runQueryOnBackgroundThread(CharSequence constraint)来实现对数据库的过滤查询。
当然FilterQueryProvider其实就是在它唯一的方法public abstract Cursor runQuery (CharSequence constraint)里面实现对数据库的过滤查询。
参考源代码可以知道如果提供了FilterQueryProvider,那么CursorAdapter就是在runQueryOnBackgroundThread方法中直接调用FilterQueryProvider的runQuery方法来进行数据库的过滤查询
/***
* AndroidManifest.xml
*
<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>
/***
* AutoMultipleContacts.java
*
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.Contacts;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import android.widget.Filterable;
import android.widget.MultiAutoCompleteTextView;
import android.widget.TextView;
public class AutoMultipleContacts extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.multipleselect);
Cursor peopleCursor = getContentResolver().query(Contacts.People.CONTENT_URI, PEOPLE_PROJECTION, null, null, Contacts.People.DEFAULT_SORT_ORDER);
ContactListAdapter contactadapter = new ContactListAdapter(this,peopleCursor);
MultiAutoCompleteTextView textView = (MultiAutoCompleteTextView) findViewById(R.id.contacts);
textView.setAdapter(contactadapter);
textView.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());
}
public static class ContactListAdapter extends CursorAdapter implements Filterable {
public ContactListAdapter(Context context, Cursor c) {
super(context, c);
mContent = context.getContentResolver();
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
final LayoutInflater inflater = LayoutInflater.from(context);
final TextView view = (TextView) inflater.inflate(
android.R.layout.simple_dropdown_item_1line, parent, false);
view.setText(cursor.getString(5));
return view;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
((TextView) view).setText(cursor.getString(5));
}
@Override
public String convertToString(Cursor cursor) {
return cursor.getString(5);
}
@Override
public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
if (getFilterQueryProvider() != null) {
return getFilterQueryProvider().runQuery(constraint);
}
StringBuilder buffer = null;
String[] args = null;
if (constraint != null) {
buffer = new StringBuilder();
buffer.append(\"UPPER(\");
buffer.append(Contacts.ContactMethods.NAME);
buffer.append(\") GLOB ?\");
args = new String[] { constraint.toString().toUpperCase() + \"*\" };
}
return mContent.query(Contacts.People.CONTENT_URI, PEOPLE_PROJECTION,
buffer == null ? null : buffer.toString(), args,
Contacts.People.DEFAULT_SORT_ORDER);
}
private ContentResolver mContent;
}
private static final String[] PEOPLE_PROJECTION = new String[] {
Contacts.People._ID,
Contacts.People.PRIMARY_PHONE_ID,
Contacts.People.TYPE,
Contacts.People.NUMBER,
Contacts.People.LABEL,
Contacts.People.NAME,
};
}
/***
* res/layout/multipleselect.xml
*
<?xml version=\"1.0\" encoding=\"utf-8\"?>
<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"
android:orientation=\"vertical\"
android:layout_width=\"fill_parent\"
android:layout_height=\"fill_parent\"
>
<LinearLayout
android:layout_width=\"fill_parent\"
android:layout_height=\"wrap_content\"
android:gravity=\"center_vertical\">
<MultiAutoCompleteTextView
android:id=\"@+id/contacts\"
android:textSize=\"18sp\"
android:layout_margin=\"8px\"
android:layout_width=\"0px\"
android:layout_height=\"wrap_content\"
android:layout_weight=\"1\" />
</LinearLayout>
</LinearLayout>
关于这方面的知识,还可以参见下面两篇文章:
http://blog.csdn.net/dragondog/article/details/6234052
http://hubingforever.blog.163.com/blog/static/1710405792010111011314506/
- ahznss.zip (9.3 MB)
- 下载次数: 1
- com.szty.ah.rar (2 MB)
- 下载次数: 1
- QIAOZI_Call.rar (1.5 MB)
- 下载次数: 1
- wokao.rar (1.5 MB)
- 下载次数: 1
发表评论
-
CursorAdapter Filter
2012-01-18 20:30 1202关于使用AutoCompleteTextV ... -
过滤搜索条件
2012-01-05 11:53 1180http://download.csdn.net/tag/an ... -
PopupWindow的应用 2
2011-12-23 15:37 920接上面的PopupWindow的布局文件layout_popu ... -
PopupWindow的应用 1
2011-12-23 15:31 781PopupWindow的使用,这里是分析QQ通讯录的源码看到的 ... -
点击拨号键,可选择自己的程序
2011-12-22 14:42 1196一般点击拨号键 会跳出你手机中所安装的有关联系人程序,比如:系 ... -
Cursor中文拼音排序
2011-12-20 13:57 903中文排序:有可能会想到pinying4j.jar 这个貌似 太 ... -
android 联系人快速搜索
2011-12-20 13:53 2253先来分析下 如果是搜索 ... -
ListView刷新慢 注意点
2011-11-23 14:26 2378Adapter是ListView界面与数据之间的桥梁,当列表里 ... -
android 中图片的一些操作
2011-11-15 10:16 1117图片的操作有哪些呢? 如:zoomer-缩 ... -
My Android成长之路(四)——【xml解析之XmlPull】
2011-11-11 16:43 976在android中xml的解析也是比较方便的 因为androi ... -
My Android成长之路(三)——【HttpClient】
2011-11-11 16:22 680HttpClient经常在开发的过程中会 ... -
My Android成长之路(二)——【JSON】
2011-11-11 16:11 1738如果android客户端接收到的是JSON字符串,就需 ... -
android jni开发环境的搭建
2011-11-10 10:46 1387最近一个项目可能会用 ... -
My Android成长之路(一)
2011-11-01 10:31 987我们接触到一个新的技术或者是语言的时候,我们应该都会不禁 ... -
android以后的学习过程中可能会需要一直温习的知识
2011-11-01 09:29 6551、android developer 讲解的各种布局和控件 ... -
android利用Serialization向服务器端发送任意的文件(二)
2011-06-17 13:12 1043public class AndroidClientAc ... -
android利用Serialization向服务器端发送任意的文件(一)
2011-06-17 13:04 12331、 先创建一个Java实现了Serializable接口的类 ... -
android初探,先行记录准备掌握的知识点
2011-05-26 18:35 6681、SQLite 2、文件的读写 3、sharedpref ...
相关推荐
SAI(Split APKs安装程序)是一款应用程序,可让您像安装单个软件包一样安装多个APK。这对于安装作为应用程序捆绑包分发的应用程序很有用,因为Android没有提供从Google Play以外的其他来源安装它们的内置方法。 ...
适用于安卓的apks文件安装脚本,支持apk、apks、split apk安装、备份、恢复,只是安装的话,不需要root权限,但是备份与恢复需要root权限,里面有帮助说明,很简单的一个脚本。
安卓版美顏相機_11.1.35.apks
SAI(拆分APK安装程序)是一款应用程序,可让您像安装一个软件包一样安装多个APK。这对于安装作为应用程序捆绑包分发的应用程序很有用,因为Android没有提供从Google Play以外的其他来源安装它们的内置方法。...
google组件gapps-ics-20120422-signed.zip
Apks from HUAWEI VNS-TL00 - Android 键盘 (AOSP)_6.0-eng.jenkins.20180606.124225 - Microsoft Launcher_5.10.0.55723 - Shell_6.0-eng.jenkins.20180606.124225 - TalkBack_5.0.4 - 百度输入法华为版_5.5.6.163 ...
批量安装apk的小工具,很实用,里面包括adb工具和一个自动化安装的app。
云货架上线apks-备份
J2ME Loader_apks.apk
Geekbench 5_5.4.4.apks
浮生_1.1.13_apks.apk
电工手册_49.apks
.archVMOS Pro_2.6.0.apks
电子电路计算器_1.25.apks
来源于github开发者的原版资源! Android 拆分APK安装程序,可安装 .apks / apk 等格式的应用包
apks for google play store installation for android
Discord_178.19 - Stable.apks
Discord_149.11 - Stable.apks
Archer Hunter_0.19.314_apks.apk
Split APKs Installer SAI安装器v4.5捐赠版.zip含下载地址可存云盘