6.19
AutoCompleteTextView
+
SQLite
实现自动检索
问题
虽然Android文档包含一个完整的工作示例使用一个ArrayAdapter的AutoCompleteTextView,只是替换一个SimpleCursorAdapter示例不工作。
解
使用SimpleCursorAdapter而不是ArrayAdapter有两个额外的扭曲:
?您需要告诉适配器在用户选择完成后要使用哪个列填充文本视图。
?您需要根据用户在文本字段中的最新输入,告知适配器如何重新查询。否则,它将显示游标返回的所有行,列表不会缩小以包括实际感兴趣的项目。
讨论
以下示例代码通常位于包含AutoCompleteTextView的活动的onCreate()方法中。它从其活动的布局检索AutoCompleteTextView,创建一个SimpleCursorAdapter,配置SimpleCursorAdapter以使用AutoCompleteTextView,然后将适配器分配给视图。
示例6-26中标记了Android Dev Guide中的ArrayAdapter示例的两个重要区别。它们都在下面的例子中简短的讨论。
实例6-26。 onCreate()代码
使用ArrayAdapter,不需要指定如何将用户的选择转换为字符串。但是,SimpleCursorAdapter支持在建议的文本中使用一列,在用户选择建议后,文本字段的另一列将被输入文本字段。虽然最常见的情况是使用相同的文本为建议,你在文本字段中选择后,它是不是默认值。默认是用光标的toString()表示填充文本视图 - 类似android.database.sqlite.SQLiteCursor@f00f00d0。
使用ArrayAdapter,系统负责过滤替代项,以显示那些以用户输入到文本字段为止的字符串。
SimpleCursorAdapter更灵活,但是默认行为也没有用。如果无法为适配器编写FilterQueryProvider,则无论用户键入什么类型,AutoCompleteTextView都将显示初始的一组建议。使用FilterQueryProvider,建议按预期工作。
问题
虽然Android文档包含一个完整的工作示例使用一个ArrayAdapter的AutoCompleteTextView,只是替换一个SimpleCursorAdapter示例不工作。
解
使用SimpleCursorAdapter而不是ArrayAdapter有两个额外的扭曲:
?您需要告诉适配器在用户选择完成后要使用哪个列填充文本视图。
?您需要根据用户在文本字段中的最新输入,告知适配器如何重新查询。否则,它将显示游标返回的所有行,列表不会缩小以包括实际感兴趣的项目。
讨论
以下示例代码通常位于包含AutoCompleteTextView的活动的onCreate()方法中。它从其活动的布局检索AutoCompleteTextView,创建一个SimpleCursorAdapter,配置SimpleCursorAdapter以使用AutoCompleteTextView,然后将适配器分配给视图。
示例6-26中标记了Android Dev Guide中的ArrayAdapter示例的两个重要区别。它们都在下面的例子中简短的讨论。
实例6-26。 onCreate()代码
final AutoCompleteTextView itemName =
(AutoCompleteTextView) findViewById(R.id.item_name_view);
SimpleCursorAdapter itemNameAdapter = new SimpleCursorAdapter(
this, R.layout.completion_item, itemNameCursor, fromCol, toView);
itemNameAdapter.setStringConversionColumn(
itemNameCursor.getColumnIndexOrThrow(GroceryDBAdapter.ITEM_NAME_COL));
itemNameAdapter.setFilterQueryProvider(new FilterQueryProvider() {
public Cursor runQuery(CharSequence constraint) {
String partialItemName = null;
if (constraint != null) {
partialItemName = constraint.toString();
}
return groceryDb.suggestItemCompletions(partialItemName);
}
});
itemName.setAdapter(itemNameAdapter);
使用ArrayAdapter,不需要指定如何将用户的选择转换为字符串。但是,SimpleCursorAdapter支持在建议的文本中使用一列,在用户选择建议后,文本字段的另一列将被输入文本字段。虽然最常见的情况是使用相同的文本为建议,你在文本字段中选择后,它是不是默认值。默认是用光标的toString()表示填充文本视图 - 类似android.database.sqlite.SQLiteCursor@f00f00d0。
使用ArrayAdapter,系统负责过滤替代项,以显示那些以用户输入到文本字段为止的字符串。
SimpleCursorAdapter更灵活,但是默认行为也没有用。如果无法为适配器编写FilterQueryProvider,则无论用户键入什么类型,AutoCompleteTextView都将显示初始的一组建议。使用FilterQueryProvider,建议按预期工作。