将Android自动完成中的选择转换为字符串

3
我刚刚使用在线Web服务基于Stackoverflow上的这个答案来实现了一个文本框的自动完成功能: ArrayAdapter is updated late from Webservice in AutoCompleteTextAdapter 使用了一个ArrayAdapter<User>实现了Filterable,我成功地让自动完成功能建议我所需的条目。User是一个Java Bean,其中包含在建议中呈现的信息(年龄、姓名等)。
当我选择一个建议时,自动完成字段填充了“错误”的数据——使用toString()方法而不是bean的“name”属性。
我的问题是:我能否在适配器中重写一个方法,以便指定如何转换bean,以便为AutoCompleteTextView返回正确的属性? (理想情况下,User.toString()不应更改)
谢谢!
4个回答

8

不需要子类化 AutoCompleteTextView 并覆盖 convertSelectionToString 方法。同样的效果可以通过在 (你已经子类化的) ArrayAdapter 中重写自定义 FilterconvertResultToString 方法来实现。

我有同样的问题: 在我的 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);
}

应选为答案。 - Pijusn

2
我找到了另一种方法:
在AutoCompleteTextView中,可以通过子类重写convertSelectionToString(Object selectedItem)方法来允许自定义转换。这样,就不需要调整toString()方法了。
这种方法似乎有一个优点,即过滤器不仅可以返回字符串列表,还可以返回自定义对象列表,这些对象可以由适配器的getView(int position, View convertView, ViewGroup parent)方法用于构建更丰富的建议。
显然的缺点是,它需要为每个Filterresult类型的子类化AutoCompleteTextView,如果其toString()方法不应被修改。
@Override
protected CharSequence convertSelectionToString(Object selectedItem) {
    if(selectedItem instanceof User){
        User u = (User) selectedItem;
        return u.getUsername();
    } else {
        return super.convertSelectionToString(selectedItem);
    }
}

有什么评论吗?

1
你可以继承 AutoCompleteTextView,并添加一个 setCustomConvertSelectionToStringMethod() 方法,该方法接受一个具有自定义“toString”方法的对象(接口)。在你的 convertSelectionToString 方法中,检查是否存在 customMethod 并执行它... 这样你只需要子类化一次。 - vanleeuwenbram

2
如果您从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));
            }
        });
    }
}

在这种情况下,我不使用数据库 - 但我肯定会记住它以备将来之需!谢谢! - Patrick

2
搜索结果取决于数据的toString()返回值。在您的情况下,您需要在toString()实现中返回name字段。

是的,我也想到了这一点,但我想知道是否有适配器或其他地方(除了bean的toString方法)可以覆盖的方法。 - Patrick
жҳҜзҡ„гҖӮжӮЁеҸҜд»ҘеңЁFilterзұ»зҡ„performFilteringж–№жі•дёӯзӣҙжҺҘжҜ”иҫғconstraintе’ҢеҗҚз§°еӯ—ж®өгҖӮ - Ron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接