Я создал динамически заполненный Spinner, который получает свое содержимое по запросу базы данных Sqlite через распознаватель содержимого, это изображение вместо текста, когда он закрыт, он показывает, что выбрано, и его удивительно просто: -)
spinnerFavorites = (SpinnerMultiSameClick) v.findViewById(R.id.guide_btn_favorites);
spinnerFavorites.setOnItemSelectedListener(this);
ContentResolver resolver = activity.getContentResolver();
String[] projection = new String[] { DataContract.Favorites.FAVORITES_ID, DataContract.Favorites.NAME };
Cursor cursor = resolver.query(DataContract.Favorites.CONTENT_URI, projection, null, null, DataContract.Favorites.FAVORITES_ID +" ASC");
if (cursor.getCount() > 0) {
// create an array to specify which fields we want to display
String[] from = new String[] { DataContract.Favorites.NAME, DataContract.Favorites.FAVORITES_ID };
// create an array of the display item we want to bind our data
// to
int[] to = new int[] { android.R.id.text1, android.R.id.text2 };
SimpleCursorAdapter adapter = new SimpleCursorAdapter(activity, R.layout.ghost_text, cursor, from, to,
SimpleCursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
// get reference to our spinner
spinner.setAdapter(adapter);
adapter.setDropDownViewResource(android.R.layout.simple_list_item_single_choice);
} else {
// TODO: Maybe button to make new favList
spinnerFavorites.setVisiblity(View.GONE);
}
Теперь, это похоже на простой Spinner, который показывает, что его выбор - эта строка, он заполнит значения и поместит radioCheckbox с правой стороны, верхний / первый элемент в вашем списке будет предварительно выбран.
adapter.setDropDownViewResource(android.R.layout.simple_list_item_single_choice);
есть несколько других предопределенных макетов, которые работают довольно хорошо
- simple_list_item_checked -> показывает флажок вместо RadioButton
- simple_list_item_activation_1 или 2 -> Изменения BackgroundColor
- simple_list_item_multiple_choice -> CheckBoxes с checkMarks
для завершения здесь мой макет, он показывает помеченное или немаркированное изображение (а не выбранное), поэтому я указал R.layout.ghost_text в spinnerAdapter.
<com.netstream.ch.tv.android.ui.program.guide.land.SpinnerMultiSameClick
android:id="@+id/guide_btn_favorites"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:background="@drawable/icon_selector_guide_filter_favorites"
android:clickable="true" />
вот мой onItemSelecte, которому нужны интерфейсы OnItemSelectedListener. То, что он делает, он отслеживает с помощью логического значения, если это инициализация счетчика или нет. Если есть реальный щелчок, мы извлекаем информацию и обновляем другой элемент пользовательского интерфейса через контроллер (также может быть обратным вызовом), если выбранный элемент является элементом StandardSelected, я устанавливаю SpinnerImage невыбранным, если его еще чем-то, то стандартный элемент, который я установил spinnerImage выбрано.
@Override
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
if (parent.getId() == R.id.guide_btn_favorites) {
if (!AbsintheViewControllerFactory.getGuideController().isFavoriteListInitialisation()) {
Cursor c = (Cursor) parent.getItemAtPosition(pos);
String favid = c.getString(c.getColumnIndexOrThrow(DataContract.Favorites.FAVORITES_ID));
String name = c.getString(c.getColumnIndexOrThrow(DataContract.Favorites.NAME));
Log.d(TAG, "Set Filter to FavListId: " + favid + " by its name: " + name);
if (favid.equalsIgnoreCase(GuideViewController.allChannelsFavoritesIdentifier)) {
spinnerFavorites.setSelected(false);
} else {
spinnerFavorites.setSelected(true);
}
AbsintheViewControllerFactory.getGuideController().setFavourites(favid);
guideInfoSelectedFavoriteList.setText(name);
} else {
AbsintheViewControllerFactory.getGuideController().setFavoriteListInitialisation(false);
guideInfoSelectedFavoriteList.setText(getActivity().getResources().getString(R.string.FILTER_FAVORITE_ALL_CHANNELS));
}
}
}