Я ищу способ скрыть один элемент в виджете счетчика Android. Это позволит имитировать счетчик без выбранных элементов и гарантирует, что обратный вызов onItemSelected () всегда вызывается для каждого выбранного элемента (если скрытый элемент является «текущим»). Обычно в счетчике всегда есть один элемент, который не генерирует обратный вызов, а именно текущий.
В stackoverflow есть код для отключения (серого) элементов, но не для того, чтобы полностью скрыть элементы, как будто их не существует.
После долгих экспериментов я придумал несколько хакерское решение, которое работает на различных старых и новых платформах Android. У него есть незначительные косметические недостатки, которые трудно заметить. Я все еще хотел бы услышать более официальное решение, кроме «не делайте этого со счетчиком».
Это всегда скрывает первый элемент в счетчике, но его можно довольно легко расширить, чтобы скрыть произвольный элемент или более одного элемента. Добавьте фиктивный элемент, содержащий пустую строку, в начало вашего списка элементов счетчика. Вы можете установить текущий выбор счетчика на элемент 0 до открытия диалогового окна счетчика, это будет имитировать невыбранный счетчик.
Пример настройки счетчика с переопределением метода ArrayAdapter:
List<String> list = new ArrayList<String>();
list.add(""); // Initial dummy entry
list.add("string1");
list.add("string2");
list.add("string3");
// Populate the spinner using a customized ArrayAdapter that hides the first (dummy) entry
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list) {
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent)
{
View v = null;
// If this is the initial dummy entry, make it hidden
if (position == 0) {
TextView tv = new TextView(getContext());
tv.setHeight(0);
tv.setVisibility(View.GONE);
v = tv;
}
else {
// Pass convertView as null to prevent reuse of special case views
v = super.getDropDownView(position, null, parent);
}
// Hide scroll bar because it appears sometimes unnecessarily, this does not prevent scrolling
parent.setVerticalScrollBarEnabled(false);
return v;
}
};
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mySpinner.setAdapter(dataAdapter);
tv.setVisibility(View.GONE);
линия не нужна. Комментирование этого не имеет никакого (визуального) значения, по крайней мере, для Android 4.4.2 / KitKit (на LG / Google Nexus 4).setTag(1)
textView в позиции 0, а затем использовал,convertView.getTag() != null
чтобы определить, было ли повторно используемое представление представлением высоты 0, созданным для позиции 0, или обычным представлением, используемым для других элементов счетчика. Это было сделано для того, чтобы я могsuper.getDropDownView(position, convertView, parent)
иногда использовать вместо того, чтобы всегда создавать новое представление.Ответы:
Чтобы скрыть произвольный элемент или более одного элемента, я думаю, вы можете реализовать свой собственный адаптер и установить индекс (или список индексов), который вы хотите скрыть.
И используйте свой собственный адаптер при создании списка элементов.
(Я не тестировал код) надеюсь, что это поможет.
источник
Легче скрыть элемент в конце списка, усекая список.
Но сначала вы должны выбрать его, чтобы он появился в счетчике, а затем проверить, был ли выбран один из отображаемых элементов.
источник
Чтобы скрыть любой элемент в раскрывающемся списке счетчика, вам необходимо передать позицию элемента, который необходимо скрыть на основе требуемых критериев. Я добился этого в случае использования скрытия элемента, который выбран из раскрывающегося списка
А настройка адаптера примерно такая
При выборе некоторых элементов из раскрывающегося списка также необходимо изменить позицию
источник
Ради интереса я решил использовать "Подсказка" в качестве подсказки. Этот код создан для
Xamarin.Android
, но его можно идеально перенести на Java за 10 минут. Используйте его как простой,ArrayAdapter
не добавляя элементы с индексом 0 или с индексом подсчета в исходный массив. Он также устанавливаетсяSpinnerGeolocation.SelectedItemId
на -1, когда ничего не выбрано (hint
это текущий элемент).источник
Я нашел это решение, которое решило мою проблему.
источник
Я думаю, что будет лучше поставить проверку в Array List, а не в Spinner, потому что после фильтрации элемента его можно будет добавить в Spinner
источник
Другой подход, который лучше всего сработал для меня, - это вернуть новый пустой объект представления. Это в значительной степени чистый подход, поскольку вы не играете с элементами массива.
Создайте свой класс адаптера, расширяющий
ArrayAdapter
внутри вашего метода
источник
Это очень старый вопрос, но я нашел хороший (и, вероятно) чистый способ не показывать первые элементы. Вдохновленный ответом @Romich, я добавил аналогичную логику, чтобы пропустить первый элемент (ы).
Это эффективно скрывает произвольное количество элементов (по умолчанию 1). Код сообщает только о том, что размер объектов для рендеринга короче, чем он есть на самом деле, а также изменяет индекс элементов для рендеринга, поэтому мы пропускаем произвольное количество элементов.
Чтобы не усложнять задачу, я исключил решение, которое я использую в настоящее время, которое поддерживает скрытие списка случайных элементов, но этим можно легко управлять с помощью нескольких настроек кода.
источник