2014-09-09 2 views
1

AutoCompleteTextView предлагает предложение, которое заменит весь контент в представлении. Есть ли класс View, который предоставляет этот объект на уровне слов? Например, если у меня есть «All work and no pl», тогда я должен быть в состоянии предложить «играть», «пожалуйста» и т. Д., Который завершил бы это слово. Если я выберу «play», он должен стать «All work and no play».AutoCompleteTextView @ уровень слова

ответ

2

Это возможно с помощью MultiAutoCompleteTextView и пользовательских Tokenizer

Я переориентирован на CommaTokenizer из исходного кода Android, так что любой символ может использоваться для разделения слов в MultiAutoCompleteTextView. Опасайтесь, непроверенный код

public static class CustomTokenizer implements MultiAutoCompleteTextView.Tokenizer { 
    private final char WHITE_SPACE = ' '; 
    private final char TOKEN_TERMINATING_CHAR; 
    private final String TOKEN_TERMINATING_STRING; 

    public CustomTokenizer(char tokenTerminatingChar) { 
     TOKEN_TERMINATING_CHAR = tokenTerminatingChar; 
     if (TOKEN_TERMINATING_CHAR == WHITE_SPACE) { 
      TOKEN_TERMINATING_STRING = String.valueOf(TOKEN_TERMINATING_CHAR); 
     } else { 
      TOKEN_TERMINATING_STRING = String.valueOf(TOKEN_TERMINATING_CHAR) + String.valueOf(WHITE_SPACE); 
     } 
    } 

    @Override 
    public int findTokenStart(CharSequence text, int cursor) { 
     int i = cursor; 

     while (i > 0 && text.charAt(i - 1) != TOKEN_TERMINATING_CHAR) { 
      i--; 
     } 
     while (i < cursor && text.charAt(i) == WHITE_SPACE) { 
      i++; 
     } 

     return i; 
    } 

    @Override 
    public int findTokenEnd(CharSequence text, int cursor) { 
     int i = cursor; 
     int len = text.length(); 

     while (i < len) { 
      if (text.charAt(i) == TOKEN_TERMINATING_CHAR) { 
       return i; 
      } else { 
       i++; 
      } 
     } 

     return len; 
    } 

    @Override 
    public CharSequence terminateToken(CharSequence text) { 
     int i = text.length(); 

     while (i > 0 && text.charAt(i - 1) == WHITE_SPACE) { 
      i--; 
     } 

     if (i > 0 && text.charAt(i - 1) == TOKEN_TERMINATING_CHAR) { 
      return text; 
     } else { 
      if (text instanceof Spanned) { 
       SpannableString sp = new SpannableString(text + TOKEN_TERMINATING_STRING); 
       TextUtils.copySpansFrom((Spanned) text, 0, text.length(), 
         Object.class, sp, 0); 
       return sp; 
      } else { 
       return text + TOKEN_TERMINATING_STRING; 
      } 
     } 
    } 
} 
1

Я думаю, вы можете сделать это с помощью адаптера, который реализует Filterable, путем переопределения метода getFilter() вы можете вернуть собственный фильтр.

В пользовательском Фильтре будет отменен метод с именем performFiltering (префикс CharSequence). префикс параметра был бы «Все работа и нет pl» в вашем примере, вы можете разобрать его и получить «pl», тогда пришло время получить слова соответствия и вернуть их.

В другом переопределенном методе publishResults (ограничение CharSequence, результаты FilterResults) вы можете получить результат запроса и сделать что-то, чтобы обновить интерфейс, например notifyDataSetChanged(), чтобы обновить ListView.

Наконец, вы можете добавить «Все работы и нет» перед «воспроизведением» в OnItemClickListener из AutoCompleteTextView, когда пользователь нажал.

Вот код, как пользовательский адаптер и фильтр в ответе Митхун в:

Android AutoCompleteTextView with Custom Adapter filtering not working

+0

Спасибо за предложение Jared. Я думал, что забыл, что портной сделал это! –

Смежные вопросы