Преобразование выделения в автозаполнении Android в строку - PullRequest
3 голосов
/ 12 сентября 2011

Я только что реализовал автозаполнение для текстового поля, используя онлайн-сервис на основе этого ответа на Stackoverflow: ArrayAdapter обновляется поздно с веб-сервиса в AutoCompleteTextAdapter

Используя ArrayAdapter<User> implements Filterable, мне удалось, что автозаполнение предлагает мне записи, как предполагалось. User - это Java-бин, содержащий информацию, представленную в предложении (возраст, имя, ...).

Когда я выбираю предложение, поле автозаполнения заполняется «неправильными» данными - с использованием метода toString() вместо свойства «name» компонента.

Мой вопрос таков: могу ли я переопределить (в адаптере) метод, который позволит мне указать, как преобразовать бин, чтобы возвращалось правильное свойство для AutoCompleteTextView? (в идеале, User.toString () не следует изменять)

Thx!

Ответы [ 4 ]

8 голосов
/ 05 октября 2012

Нет необходимости создавать подклассы AutoCompleteTextView и переопределять метод convertSelectionToString.То же самое можно достичь, переопределив метод convertResultToString в вашем пользовательском Filter in (ваш уже подкласс) ArrayAdapter.

У меня была та же проблема: пользовательские объекты в моем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 голосов
/ 23 сентября 2011

Я нашел другой способ:

Метод convertSelectionToString(Object selectedItem) в AutoCompleteTextView может быть переопределен подклассами для обеспечения пользовательских преобразований.Таким образом, настройка метода toString() не требуется.

Это, как мне кажется, имеет то преимущество, что Фильтр может возвращать не только список строк, но и список пользовательских объектов, которые могутиспользоваться getView(int position, View convertView, ViewGroup parent) адаптера для создания "более богатых" предложений.

Очевидным недостатком является то, что он требует создания подкласса AutoCompleteTextView для каждого типа Filterresult, метод toString () которого не должен изменяться.

@Override
protected CharSequence convertSelectionToString(Object selectedItem) {
    if(selectedItem instanceof User){
        User u = (User) selectedItem;
        return u.getUsername();
    } else {
        return super.convertSelectionToString(selectedItem);
    }
}

Есть комментарии по этому поводу?

2 голосов
/ 24 октября 2011

Если вы подкласса вашего собственного адаптера из 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));
            }
        });
    }
}
2 голосов
/ 12 сентября 2011

Результаты поиска зависят от того, что возвращает toString() данных.В вашем случае вам нужно вернуть поле name в реализации toString().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...