Удалить 1й айтем при открытии Spinner

398
31 декабря 2016, 14:34

Мне нужно, чтоб при развертывании Spinner 1й пункт "Выберете..." скрывался или убирался из массива, привязанного к Spinner.
Пробовал установить visability GONE 1-му айтему - скрывается не полностью, если из метода getDropDownView() вернуть null - вылетит с ошибкой. Пробовал отслеживать событие открытия Spinner с помощью View.OnClickListener - тоже вылетел с ошибкой:

java.lang.RuntimeException: Don't call setOnClickListener for an AdapterView. You probably want setOnItemClickListener instead
        at android.widget.AdapterView.setOnClickListener(AdapterView.java:774)
Answer 1

Решение следующее. В данных создаем последний пункт с той надписью, которая должна быть в закрытом спиннере (в примере это select city ..). Позицию в спиннере переводим на этот пункт. Теперь у нас в закрытом состоянии все отображается как надо.

MainActivity^

 public class MainActivity extends AppCompatActivity  {
    Spinner spinner;
    private String[] city = { "Moscow", "New York", "Berlin", "Select city .." };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        spinner = (Spinner)findViewById(R.id.spinner);
        CustomAdapter adapter = new CustomAdapter(this, android.R.layout.simple_spinner_item, city);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinner.setAdapter(adapter);
        spinner.setSelection(city.length - 1);
    }
}

Теперь, для скрытия этого пункта при раскрытии списка просто уменьшаем счетчик пунктов в адаптере на один, переопределив метод getCount()

CustomAdapter:

public class CustomAdapter extends ArrayAdapter {
    String [] city;

    public CustomAdapter(Context context, int resourceId, String[] city) {
        super(context, resourceId, city);
        this.city = city;
    }
    @Override
    public int getCount() {
        return city.length - 1;
    }
}

Скрыть можно и первый пункт, но этого не нужно делать, так как такое решение усложнит логику, что связано с тем, что будет несоответствие позиций списка и позиций в спиннере, так как хотя пункт и скрыт, у него остается индекс.
То есть получится так, что для позиции данных city[1] спиннер будет возвращать position = 0. При размещении стартового пункта в конце списка мы избегаем этой проблемы. Кроме того, так решение намного проще и требует намного меньше кода.

READ ALSO
Сравнение дат с помощью JPA criteria API

Сравнение дат с помощью JPA criteria API

Мне нужно получить данные из базыЕсть две переменные LocalDate startDate и LocalDate endDate

516
Настройка Google Play Services в Android Studio

Настройка Google Play Services в Android Studio

Не могли бы вы описать, что нужно сделать по пунктам, чтобы подключить Google Play Services к своему приложению, а также сделать простой рейтинг участников

647
Widget с определенными TextView

Widget с определенными TextView

Как показывать только те TextView, которые нужно?

514
Как открыть Activity поверх другого активити?

Как открыть Activity поверх другого активити?

Есть приложения с несколькими экранами и активностямиКак можно сделать так, чтобы открывая активити2 оно не прекращало работу активити1,...

526