Альтернатива высокопрофессиональному классу SPINNER в Android

в моем текущем проекте я занимался классом spinner, который был настроен практически из всех возможных аспектов. Таким образом, я получил некоторые детализированные аспекты, поскольку я занимаюсь этим. Поэтому я начну с той части, которая показывает, почему она ошибочна.

1_ Нет прослушивателя по умолчанию, который будет запущен при всплывающем всплывающем окне/макете/диалоге, созданном-показанном (раздутом) событии. Есть несколько обходных решений, таких как прослушиватель ontouch на spinner, а затем проверить, произошло ли прикосновение в области spinner, тогда вы знаете, что всплывающее окно будет отображаться, но все же ненадежное, так как вы можете заполнить всплывающее окно с задачей async.

2_On выбранное событие не срабатывает при повторном выборе того же индекса. Это действительно раздражает, так как я могу обновлять адаптер в зависимости от других условий, которые изменят текущий выбор и порядок списка и т.д. Конечно, есть способ обхода путем создания собственного класса spinner и добавления его в xml, например com.myproject.customspinner и т.д...... (Spinner: onItemSelected не вызывается, когда выбранный элемент остается неизменным)

3_ Нет рабочего функционального события OnClickListener и OnItemLongTouchListener для spinner.

4_Changing Spinner DropDown атрибуты элемента списка разделителей, такие как цвет, требуют больше труда, чем изменение всех всплывающих и обратных представлений фона, что очень абсурдно.

5_Spinner само название очень абсурдно =))).

Итак, что я могу использовать вместо Spinner? Какой лучший способ пойти?

Ответ 1

Вы можете создать собственный счетчик, используя ListPopupWindow, в TextView, когда TextView щелкнет на раскрывающемся списке ListPopupWindow, подобном раскрывающемуся списку, и вы можете выбрать элемент. Если вам нужно, я помогу вам в этом.

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);
}

Проверьте этот код и внесите изменения в соответствии с вашими требованиями. Если вы обнаружили какую-либо проблему, я здесь, чтобы помочь вам.:)

Ответ 2

Здесь показано, как заменить Spinner собственной реализацией. Это довольно просто, важно использовать PopupWindow, содержащее представление списка, для имитации поведения макета Spinner.

https://www.androidcode.ninja/show-listview-as-drop-down-android/

Это устраняет проблемы со странными обработчиками событий в реализации Spinner. Это также намного легче настроить.

Единственная проблема с этим подходом заключается в том, что, как и Spinner, он по-прежнему использует PopupWindow, что вызывает странные ошибки в пользовательском интерфейсе системы, когда вы находитесь в режиме полного погружения/полноэкранного режима. Но с этими ошибками легче справиться, когда вам также не приходится иметь дело с конкретными проблемами Spinner.

Ответ 3

Выкладываю упрощенную версию принятого kotlin ответа здесь, что может помочь. Сначала сделайте член ListPopupWindow в своей Activity или другом class-

private val listPopupView by lazy { ListPopupWindow(this) }

Затем инициализируйте его в onCreate() method-

val dataList = arrayOf("item1", "item2", "item3", "item4")
listPopupView.setAdapter(ArrayAdapter(this, android.R.layout.simple_list_item_1, dataList))
listPopupView.setOnItemClickListener { _, _, position, _ ->
    selectionTextView.text = dataList[position]
    listPopupView.dismiss()
    // do other things on selection
}
listPopupView.anchorView = selectionTextView
selectionTextView.setOnClickListener { listPopupView.show() }

И вы сделали!