Заполнение вариантов MultiAutoCompleteTextView из базы данных

Понадобилось заполнить варианты в MultiAutoCompleteTextView из базы данных. Поиски завели в какие-то дебри, приводящие к куче непонятного кода. Поскольку вникать в эти дебри не хватило квалификации да и не было особого желания, решил задачу менее по-гугловски и более проще.

Вариантов, выбираемых из базы данных у меня было не очень много, поэтому решение родилось простое — получить данные из БД, сделать из них массив, скормить массив в ArrayAdapter<String>, а потом отдать этот адаптер на растерзание MultiAutoCompleteTextView. Не красиво, но работает. И для небольшого списка вариантов вполне сойдет:

Итак, запускам лоадер:


// Идентификатор лоадера
public final int MY_LOADER = 1;

...

// Получаем поле ввода
macTextView = (MultiAutoCompleteTextView) v.findViewById(R.id.macTextView);

...

// Где надо запускаем выборку из базы
getSupportLoaderManager().initLoader(MY_LOADER, null, this);

...

// Callback-вызов создания лоадера
@Override
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
	// arg0 - это индекс лоадера

	// В зависимости от индекса лоадера запускаем соответствующий запрос к БД
	switch (arg0) {

		case MY_LOADER: // Запрос вариантов MultiAutoCompleteTextView
			String[] cols = new String[] { "_id", "name" }; // Список столбцов
			String selection = null; // Условие выборки

			// создаем и возвращаем настроенный лоадер поиска
			return new CursorLoader(this,
					MyContentProvider.MY_URI, cols, selection,
					null, null);
	}

	return null;
}

Тут все просто, обычная работа с лоадером и контент-провайдером. Далее, когда выборка закончилась — основное действие:

// обработчик окончания выборки из БД
@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) {

	int i = 0;

	// Итак, в зависимости от лоадера
	switch (arg0.getId()) {

	case MOL_LOADER: // Закончена загрузка МОЛ
		// Создаем массив, размером с количество записей курсора
		// Пробегаем по всем записям курсора и добавляем их в массив
		arg1.moveToFirst();
		String[] mVars = new String[arg1.getCount()];

		if (arg1.moveToFirst()) {
			// Заполняем массив из БД
			do {
				mVars[i] = arg1.getString(1);
				i++;
			} while (arg1.moveToNext());

			// Создаем и настраиваем простой адаптер массива
			mAdapter = new ArrayAdapter<String>(this,
					android.R.layout.simple_dropdown_item_1line, mVars);

			// устанавливаем адаптер в поле ввода
			macTextView.setAdapter(mAdapter);
		}
		break;
	}
}

Вот и все, результат на лице. Все просто. Для небольших объемов данных вполне сойдет.

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

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