将Android Autocomplete中的选择转换为字符串

将Android Autocomplete中的选择转换为字符串,android,autocomplete,Android,Autocomplete,根据Stackoverflow上的回答,我刚刚使用在线Web服务实现了文本字段的自动完成: 使用ArrayAdapter implements Filterable,我已经成功地实现了自动完成功能,按照预期向我建议条目。 User是一个Java Bean,它包含建议中提供的信息(年龄、姓名等) 当我选择一个建议时,Autocomplete字段将填充“错误”数据-使用toString()方法,而不是bean的“name”属性 我的问题是:我是否可以重写(在适配器中)一个方法,该方法允许我指定如何

根据Stackoverflow上的回答,我刚刚使用在线Web服务实现了文本字段的自动完成:

使用
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作为答案。