【问题标题】:Convert a selection in Android Autocomplete to a String将 Android Autocomplete 中的选择转换为字符串
【发布时间】:2012-10-05 15:10:43
【问题描述】:

我刚刚基于 Stackoverflow 上的这个答案,使用在线网络服务实现了一个文本字段的自动完成功能: ArrayAdapter is updated late from Webservice in AutoCompleteTextAdapter

使用ArrayAdapter<User> implements Filterable,我已经设法让自动完成功能按预期建议我输入。 User 是一个 Java Bean,其中包含在建议中呈现的信息(年龄、姓名、...)。

当我选择一个建议时,自动完成字段会填充“错误”数据 - 使用 toString()方法,而不是 bean 的“名称”属性。

我的问题是:我是否可以(在适配器中)覆盖一个方法,该方法允许我指定如何转换 bean 以便为 AutoCompleteTextView 返回正确的属性? (理想情况下,不应更改 User.toString())

谢谢!

【问题讨论】:

    标签: android autocomplete


    【解决方案1】:

    没有必要继承AutoCompleteTextView并覆盖convertSelectionToString方法。通过在(您已经子类化的)ArrayAdapter 中覆盖您的自定义 Filter 中的 convertResultToString 方法,可以实现相同的目标。

    我遇到了同样的问题:我的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);
    }
    

    【讨论】:

    • 应该被选作答案。
    【解决方案2】:

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

    【讨论】:

    • 是的,这也发生在我身上,但是我想知道适配器或其他地方(bean 的 toString 除外)中是否有可以替代的方法。
    • 是的。您可以直接比较constraintFilter 类的performFiltering 方法中的名称字段。
    【解决方案3】:

    我找到了另一种方法:

    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);
        }
    }
    

    有这方面的专家吗?

    【讨论】:

    • 您可以继承 AutoCompleteTextView 并添加一个方法 setCustomConvertSelectionToStringMethod(),该方法采用自定义“toString”方法的对象(接口)在您的 convertSelectionToString 方法中检查 customMethod 并在它存在时执行...这样你只需要子类一次
    【解决方案4】:

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

    【讨论】:

    • 在这种情况下,我不使用数据库 - 但我一定会记住它以备将来使用!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-09-08
    • 2017-01-22
    • 2017-12-15
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 2016-08-11
    相关资源
    最近更新 更多