Альтернатива сильно ущербному классу 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 11

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.