2011.09.07(5)——— android android 跨进程通信之content provider + AutoCompleteTextView
参考:
http://blog.csdn.net/yan8024/article/details/6444368
http://www.blogjava.net/nokiaguy/archive/2010/07/31/327623.html
在上一节的基础上 增加了自动提示框的功能 就是将上一届的EditText改为AutoCompleteTextView
1、自定义provider需要修改 因为我们需要根据前几个字符来得到name
private static final String AUTHORITY = "com.helloword.myprovider" ;
private static UriMatcher uriMatcher;
private static final int ONE = 1 ;
private static final int MORE = 2 ;
private static final int MORE2 = 3 ;
static
{
// 添加访问ContentProvider的Uri
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(AUTHORITY, "one" , ONE);
uriMatcher.addURI(AUTHORITY, "more/*" , MORE);
uriMatcher.addURI(AUTHORITY, "more2/*" , MORE2);
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
Cursor cursor = null;
System.out.println("query");
switch(uriMatcher.match(uri)){
case ONE:
cursor = db.query(TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder);
break;
case MORE:{
String word = uri.getPathSegments().get(1);
cursor = db.rawQuery("select * from "+TABLE_NAME+" where displayname like ?", new String[]{word+"%"});
break;
}
case MORE2:
String word = uri.getPathSegments().get(1);
cursor = db.rawQuery("select displayname as _id from "+TABLE_NAME+" where displayname like ?", new String[]{word+"%"});
break;
default:
throw new IllegalArgumentException("无效参数");
}
return cursor;
}
注意看:case MORE2 时
select displayname as _id from
必须更名为_id
2、从另一个应用调用:
main.xml
<AutoCompleteTextView
android:id="@+id/autoComplete"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</AutoCompleteTextView>
auto.xml 下拉框的布局文件
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tvWordItem"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:gravity="center_vertical"
android:paddingLeft="6dip"
android:textColor="#000"
android:minHeight="?android:attr/listPreferredItemHeight"
/>
Activity
actv = (AutoCompleteTextView)findViewById(R.id.autoComplete);
//将AutoCompleteTextView与ArrayAdapter进行绑定
//actv.setAdapter(adapter);
//设置AutoCompleteTextView输入1个字符就进行提示
actv.setThreshold(1);
actv.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// TODO Auto-generated method stub
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
if ("" .equals(s.toString()))
return ;
System.out.println(s.toString());
Uri uri = Uri.parse(MORE2 + "/" + s.toString());
// 从ContentProvider中获得以某个字符串开头的所有单词的Cursor对象
Cursor cursor = getContentResolver().query(uri, null , null , null , null );
adapter = new TelListAdapter(helloWorldActivity.this ,
cursor, true );
actv.setAdapter(adapter);
}
});
public class TelListAdapter extends CursorAdapter
{
private LayoutInflater layoutInflater;
@Override
public CharSequence convertToString(Cursor cursor)
{
return cursor == null ? "" : cursor.getString(cursor
.getColumnIndex("_id"));
}
// 用于将_id字段(也就是diaplayname字段)的值设置TextView组件的文本
// view参数表示用于显示列表项的TextView组件
private void setView(View view, Cursor cursor)
{
TextView tvWordItem = (TextView) view;
tvWordItem.setText(cursor.getString(cursor.getColumnIndex("_id")));
}
@Override
public void bindView(View view, Context context, Cursor cursor)
{
setView(view, cursor);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent)
{
View view = layoutInflater.inflate(R.layout.auto, null);
setView(view, cursor);
return view;
}
public TelListAdapter(Context context, Cursor c, boolean autoRequery)
{
super(context, c, autoRequery);
// 通过系统服务获得LayoutInflater对象
layoutInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
}
在编写DictionaryAdapter类时应注意如下3点:
1. 为了将Cursor对象与AutoCompleteTextView组件绑定, DictionaryAdapter类必须从CursorAdapter类继承。
2. 由于CursorAdapter类中的convertToString方法直接返回了Cursor对象的地址,因此,在DictionaryAdapter类中必须覆盖convertToString方法,以返回当前选中的单词。CursorAdapter类中的convertToString方法的源代码。
在这里要注意一下,当选中AutoCompleteTextView组件中单词列表中某一个单词后,系统会用convertToString方法的返回值来设置AutoCompleteTextView组件中的文本。因此,必须使用Cursor的getString来获得相应的字段值。
3. 由于将Cursor对象与Adapter绑定时必须要有一个叫“_id”的字段,因此,在本例中将english字段名映射成了“_id”字段。
为了监视AutoCompleteTextView组件中的文本输入情况,需要实现android.text.TextWatcher接口。在该接口中只需要实现afterTextChanged方法即可,
4. 在DictionaryAdapter类中需要使用bindView和newView方法设置每一个列表项。bindView方法负责设置已经存在的列表项,也就是该列表项已经生成了相应的组件对象。而newView方法负责设置新的列表项,在该方法中需要创建一个View对象来显示当前的列表项
分享到:
相关推荐
本文将详细介绍如何在Android中仿照百度和谷歌的自动提示功能,利用`AutoCompleteTextView`控件来实现这一功能。 `AutoCompleteTextView`是Android SDK中的一个视图组件,它继承自`EditText`,增加了自动补全的功能...
AutoCompleteTextView是Android开发中一个非常实用的控件,它为用户提供了一种便捷的输入方式——自动补全。这个控件允许用户在输入时显示一个下拉列表,该列表包含了与用户当前输入相匹配的建议选项,从而提高输入...
在Android开发中,`AutoCompleteTextView` 是一个非常实用的组件,它提供了自动补全功能,用户在输入时可以接收到下拉列表的建议,提高了输入效率。`MultiAutoCompleteTextView` 是 `AutoCompleteTextView` 的扩展,...
在Android开发中,`AutoCompleteTextView` 是一个非常实用的组件,它允许用户在输入时自动显示匹配的建议列表,极大地提高了用户体验。结合SQLite数据库,我们可以实现高效、动态的数据检索,为用户提供实时的搜索...
在Android开发中,AutoCompleteTextView是一个非常实用的控件,它允许用户在输入时自动显示匹配的建议列表,极大地提高了用户体验。本实例将深入探讨如何使用AutoCompleteTextView,并结合具体的...
AutoCompleteTextView是Android开发中一个常用的UI组件,它在用户输入文本时提供自动补全功能,极大地提高了用户体验。本文将详细介绍如何在Android中使用AutoCompleteTextView。 1. **AutoCompleteTextView的基本...
Android 学习笔记(十四)主要聚焦于`AutoCompleteTextView`组件的使用,这是一种增强版的`EditText`,提供了自动补全功能。`AutoCompleteTextView`允许用户输入文本,并在用户输入达到一定字符数时显示一个下拉列表...
在Android开发中,`AutoCompleteTextView` 是一个非常实用的控件,用于提供用户输入时的自动补全功能。这个控件能够显著提升用户体验,因为它能够根据用户输入的部分字符快速匹配并显示可能的选择,帮助用户更快地...
在Android开发中,`AutoCompleteTextView` 是一个非常实用的组件,它允许用户在输入时获得下拉建议,类似于搜索引擎的自动填充功能。这个压缩包文件"安卓textView相关-androidAutoCompleteTextView邮箱后缀自动补全....
AutoCompleteTextView是Android开发中一个常用的UI组件,它属于EditText的一种扩展,主要功能是在用户输入时提供自动补全建议。这个简单的例子展示了如何利用自定义布局来实现AutoCompleteTextView的功能,使得用户...
在Android开发中,AutoCompleteTextView是一个非常实用的控件,它能为用户提供输入提示,即在用户输入文本时显示与输入内容匹配的建议列表。这个组件通常用于提升用户体验,特别是在需要用户输入特定数据(如城市名...
Android开发是目前移动应用开发中非常重要的一环,尤其是在构建跨平台应用时,对Android API的了解程度直接影响到开发效率和应用的质量。在给定文件中,我们可以看到一份关于Android开发中TextView组件的API详细描述...
本资源"安卓Android源码——MyAutoCompleteTextview.rar"显然是一个自定义版本的 `AutoCompleteTextView` 实现,我们可以从这个源码中学习到如何扩展和定制这一组件。 1. **自定义`AutoCompleteTextView`** - ...
在Android开发中,AutoCompleteTextView是一个非常常用的组件,它提供了自动补全的功能,适用于用户输入时需要提示相关信息的场景,比如搜索框、地址输入等。本文将深入探讨如何自定义AutoCompleteTextView,以满足...
在Android开发中,`AutoCompleteTextView` 是一个非常实用的组件,它允许用户在输入时自动显示匹配的建议列表。通常,我们使用`ArrayAdapter`来连接数据源和`AutoCompleteTextView`,但有时默认的功能可能无法满足...
AutoCompleteTextView是Android系统提供的一种可以自动补全的文本输入控件,它允许用户在输入时根据已有的数据集匹配并显示建议的选项。这个功能通常用于搜索框、地址输入等场景,提升用户体验。在本主题中,我们将...
在Android开发中,`AutoCompleteTextView` 是一个非常实用的组件,它允许用户在输入时自动显示匹配的建议列表,通常用于实现搜索框或者输入补全功能。`AutoCompleteTextView` 结合历史记录功能,可以提供更加人性化...