将Android Autocomplete中的选择转换为字符串
根据Stackoverflow上的回答,我刚刚使用在线Web服务实现了文本字段的自动完成: 使用将Android Autocomplete中的选择转换为字符串,android,autocomplete,Android,Autocomplete,根据Stackoverflow上的回答,我刚刚使用在线Web服务实现了文本字段的自动完成: 使用ArrayAdapter implements Filterable,我已经成功地实现了自动完成功能,按照预期向我建议条目。 User是一个Java Bean,它包含建议中提供的信息(年龄、姓名等) 当我选择一个建议时,Autocomplete字段将填充“错误”数据-使用toString()方法,而不是bean的“name”属性 我的问题是:我是否可以重写(在适配器中)一个方法,该方法允许我指定如何
ArrayAdapter implements Filterable
,我已经成功地实现了自动完成功能,按照预期向我建议条目。
User
是一个Java Bean,它包含建议中提供的信息(年龄、姓名等)
当我选择一个建议时,Autocomplete字段将填充“错误”数据-使用toString()
方法,而不是bean的“name”属性
我的问题是:我是否可以重写(在适配器中)一个方法,该方法允许我指定如何转换bean,以便为AutoCompleteTextView返回正确的属性?
(理想情况下,不应更改User.toString())
谢谢 搜索结果取决于数据的
toString()
返回的内容。在您的情况下,需要在toString()
实现中返回name
字段。我找到了另一种方法:
AutoCompleteTextView中的方法convertSelectionToString(Object selectedItem)
可以被子类覆盖,以允许自定义转换。这样,就不需要调整toString()
方法
在我看来,这样做的好处是,过滤器不仅可以返回字符串列表,还可以返回自定义对象列表,适配器的getView(int-position,View-convertView,ViewGroup-parent)
可以使用这些对象来构造“更丰富”的建议
明显的缺点是,它需要为其toString()方法不应修改的每个Filterresult类型子类化AutoCompleteTextView
@Override
protected CharSequence convertSelectionToString(Object selectedItem) {
if(selectedItem instanceof User){
User u = (User) selectedItem;
return u.getUsername();
} else {
return super.convertSelectionToString(selectedItem);
}
}
对此有何评论 如果您从
SimpleCursorAdapter
对自己的适配器进行子类化,则可以在构造函数中的适配器上设置CursorToStringConverter
private class AutoCompleteAdapter extends SimpleCursorAdapter {
public AutoCompleteAdapter(Context context, int layout, Cursor c, String[] from, int[] to) {
super(context, layout, c, from, to);
/* Other setup code here */
setCursorToStringConverter(new CursorToStringConverter() {
@Override
public CharSequence convertToString(Cursor item) {
return item.getString(item.getColumnIndex(DESIRED_COLUMN_NAME));
}
});
}
}
无需子类化
AutoCompleteTextView
并重写convertSelectionToString
方法。通过覆盖(已经子类化的)ArrayAdapter
中的自定义Filter
中的方法,也可以实现同样的效果
我也遇到了同样的问题:我的ArrayAdapter
中的自定义对象的toString()
实现是我无法控制的。我实现了如下方法:
// In custom Filter implementation
@Override
public CharSequence convertResultToString(Object result) {
if(result instanceof MyCustomClass) {
return ((MyCustomClass) result).getAttribute("name");
}
return super.convertResultToString(result);
}
是的,我也这么想,但是我想知道适配器中是否有一个方法,或者我可以替代它的另一个地方(bean的toString除外)。是的。您可以在
Filter
类的performFiltering
方法中将约束
与name字段进行直接比较。在这种情况下,我不使用数据库,但我一定会记住它,以备将来使用!谢谢您可以将AutoCompleteTextView子类化,并添加一个方法setCustomConvertSelectionToStringMethod(),该方法在您的ConvertSelectionToStringMethod中接受一个带有自定义“toString”方法的对象(接口),您可以检查customMethod并在该方法存在时执行。。。这样,您只需选择子类once作为答案。