Альтернатива сильно ущербному классу SPINNER в Android
В моем текущем проекте я имел дело с классом spinner, который был настроен почти со всех возможных сторон. Таким образом, я получил некоторые подробные аспекты, как я имею дело с ним . Поэтому я начну с той части, которая показывает, почему он испорчен.
1_ нет прослушивателя по умолчанию, который будет запущен при появлении события всплывающее окно/макет/диалоговое окно created-showed(layout inflated). Есть некоторые обходные пути, такие как ontouch listener на spinner, затем проверьте, если на сенсорном финише произошло в области spinner, тогда вы знаете, что всплывающее окно будет показано, но все еще не надежно, так как вы можете заполнить всплывающее окно с асинхронной задачей..
2_on item selected событие не срабатывает, когда тот же индекс выбран снова. Это действительно раздражает, так как я могу обновлять адаптер в зависимости от других условий, которые изменят текущий выбор и порядок списка и т. д... Конечно, есть обходной путь, создавая собственный класс spinner и добавляя его в xml, как com.мой проект.customspinner и т. д.....(Spinner: onItemSelected not вызывается, когда выбранный элемент остается прежним )
3_ нет рабочего функционала onclicklistener и onitemlongtouchlistener события для spinner.
4_Changing Spinner DropDown list divider element's attributes such as color требует больше труда, чем изменение всех dropdrown и spinner' background views, что очень абсурдно.
5_Spinner само название очень абсурдно =))).
Так что же я могу использовать вместо спиннера? Что является лучшим способом для идти?
2 ответа:
Вы можете создать пользовательский spinner с помощью ListPopupWindow в TextView означает, что при нажатии на TextView ListPopupWindow открывается как раскрывающийся список spinner, и вы можете выбрать элемент. Если вам нужно, Я помогу Вам в этом.
ListPopupWindow numberList; TextView spDays; ArrayList<Map<String, String>>() listTrans; in oncreate() spDays.setonclicklistner(this);spDays.setText("Select"); setNumberListSpinnerView(); in onclick(){ when spDays clicked :- numberList.show(); } void setNumberListSpinnerView() { numberList= new ListPopupWindow(this); numberList.setAnchorView(spDays); numberList.setOnItemClickListener((new AdapterView.OnItemClickListener() { @Override getListItem(); public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Map map = listTrans.get(position); spDays.setText(map.get("circle_name").toString()); circle_name = map.get("circle_name") + ""; circle_id = map.get("circle_id").toString(); circleList.dismiss(); Log.d("Circle id:", circle_id + ""); getRetails(); } })); } void getListItem(){ String[] numbers = {"1","2","3","4","5","6"}; listTrans = new ArrayList<Map<String, String>>(); LinkedHashMap<String, String> tran = new LinkedHashMap<String, String>(); for (String number : numbers) { tran.put("numbers", number); listTrans.add(tran); } SimpleAdapter adapter = new SimpleAdapter(AddRetailSurvey.this, listTrans, android.R.layout.simple_spinner_dropdown_item, new String[]{"numbers"}, new int[]{android.R.id.text1}); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); numberList.setAdapter(adapter); }
Проверьте этот код и измените его в соответствии с вашими требованиями. Если вы нашли какие-то проблемы, я здесь, чтобы помочь вам. :)
Здесь показано, как заменить Spinner собственной реализацией. Это довольно просто, важно использовать всплывающее окно, содержащее представление списка, чтобы имитировать поведение макета Spinner.
Https://www.androidcode.ninja / show-listview-as-drop-down-android /
Это устраняет проблемы со странными обработчиками событий в реализации Spinner. Кроме того, его гораздо проще настроить.
Единственная проблема с этим подходом заключается в том, что, как и Spinner, он все еще использует PopupWindow, который вызывает странные ошибки в пользовательском интерфейсе системы, когда вы находитесь в иммерсивном / полноэкранном режиме. Но легче справиться с этими ошибками, когда вам не нужно также иметь дело с конкретными проблемами Spinner.