Пробел как разделитель вариантов в MultiAutoCompleteTextView

Понадобилось мне в программе поле для ввода фамилии сотрудника. Список сотрудников в базе данных имел вид:

  • Иванов И. И.
  • Петров П. П.
  • Сидоров С. С.

Сотрудников было много, использовать Spinner неудобно: долго листать. посему решил использовать MultiAutoCompleteTextView — удобно, набрал две-три буквы фамилии — и выбрал из списка нужную. Однако легко это сделать у меня не получилось, ибо разделитель вариантов в MultiAutoCompleteTextView  не символ, а класс Tokenizer. В классе MultiAutoCompleteTextView есть готовый класс Tokenizer, называется CommaTokenizer, устанавливается вызовом метода setTokenizer():

MultiAutoCompleteTextView name = (MultiAutoCompleteTextView) view.findViewById(R.id.mctvName);
name.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());

Но! Этот разделитель работает только с запятыми, а у меня в ФИО запятых нет, но есть пробелы… Пришлось вооружиться гуглом, нарыл на буржуйском сайте ответ, запишу его сюда:

import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextUtils;
import android.widget.MultiAutoCompleteTextView.Tokenizer;

public class SpaceTokenizer implements Tokenizer{

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

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

		return len;
	}

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

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

		return i;
}

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

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

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

Этот класс, переданный в setTokenizer() прекрасно работает с пробелами в качестве разделителя. Набираешь пару букв фамилии — получаешь варианты.

Логично предположить так же, что в нем можно заменить пробел на любой другой символ и получить другой разделитель. Надеюсь, это пригодится не только мне.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *