2011-09-12 50 views
3

我刚刚实施了使用在线Web服务一个文本框的自动完成,在此基础上回答#2: ArrayAdapter is updated late from Webservice in AutoCompleteTextAdapter转换选择为String

使用一个ArrayAdapter<User> implements Filterable,我负责的是自动完成建议我按预期输入。 User是一个Java Bean,它包含在建议(年龄,名称,...)中提供的信息。

当我选择一个建议时,自动填充字段将填充'错误'数据 - 使用toString()方法,而不是bean的'name'属性。

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

Thx!

回答

2

我已经找到了另一种方式:在AutoCompleteTextView

方法convertSelectionToString(Object selectedItem)可以由子类重写以支持自定义的转换。这样,不需要调整toString()方法。

这在我看来有一个好处,即Filter可以返回不仅仅是一个字符串列表,而是一个自定义对象列表,它可以被适配器的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); 
    } 
} 

对此的评论?

+1

您可以创建子类AutoCompleteTextView,并添加一个方法 setCustomConvertSelectionToStringMethod(),它使用自定义的“toString”方法接受对象(接口) 在convertSelectionToString方法中,检查customMethod并执行它,如果它存在... 这样,必须子类化一次 – vanleeuwenbram

2

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

+0

是的,这也发生在我身上,但是我想知道是否有一个方法在适配器或另一个地方(除了toString的bean),我可以重写代替。 – Patrick

+0

是的。你可以在'Filter'类的'performFiltering'方法中直接比较'constraint'和name字段。 – Ronnie

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

在这种情况下,我不使用数据库 - 但我一定会牢记未来!谢谢! – Patrick

7

没有必要继承AutoCompleteTextView并覆盖convertSelectionToString方法。重写convertResultToString方法可以实现同样的效果,您可以在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); 
} 
+0

应被选为答案。 – Pijusn