onItemSelected для spinner работает не корректно

Рейтинг: -1Ответов: 1Опубликовано: 04.07.2023

Спиннер служит для смены языка по клику.

SpinnerAdapter spinnerAdapter = new SpinnerAdapter(this, R.layout.layout_spinner, languagesList);
        spinner.setAdapter(spinnerAdapter);

        //добовляем тост с уведомлением о смене языка
        Toast toast = Toast.makeText(this, "", Toast.LENGTH_SHORT);

        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @SuppressLint("UseCompatLoadingForDrawables")
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {

                Languages selectedItem = (Languages) spinner.getSelectedItem();
                String s = selectedItem.getNameLanguage();

                if (s.equalsIgnoreCase("английский")) {
                    changeLanguage("en");
                    toast.setText(R.string.toast_spinner);
                    toast.show();

                } else if (s.equalsIgnoreCase("russian")) {
                    changeLanguage("ru");
                    toast.setText(R.string.toast_spinner);
                    toast.show();
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
            }
        });
    }

С целью добавления иконок создан кастомный адаптер.

public class SpinnerAdapter extends BaseAdapter {

    Context context;
    int layout;
    List<Languages> list;

    public SpinnerAdapter(Context context, int layout, List<Languages> list) {
        this.context = context;
        this.layout = layout;
        this.list = list;
    }

    public Context getContext() {
        return context;
    }

    public int getLayout() {
        return layout;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        Languages newList = list.get(position);
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();

        @SuppressLint("ViewHolder")
        View spinner_layout = inflater.inflate(R.layout.layout_spinner, parent, false);

        TextView text = spinner_layout.findViewById(R.id.spinner_text);
        text.setText(newList.getNameLanguage());

        ImageView image  = spinner_layout.findViewById(R.id.spinner_image);
        image.setImageResource(newList.getImageLanguage());

        return spinner_layout;
    }
}

При запуске отрабатывает не корректно, а именно выбрасывает тост уже при загрузке приложения, не дожидаясь клика по спиннеру. Метод смены языка срабатывает но тут же изменяется на прежнее значение. (ощущение как будто спиннер отрабатывает 2 раза меняет язык потом меняет обратно) В логах все нормально.

До этого использовал стандартный ArrayAdapter без картинок- все работало четко как и задумывалось. Поэтому сам грешу на кастомный адаптер - возможно где то что то не учел.

Ответы

▲ 0Принят

Проблема решена. Некорректное поведение было вызвано устаревшей логикой метода принудительной смены языка. Обновил метод до такой версии и все заработало корректно.

public void changeLanguage(String lang) {
        LocaleListCompat localeListCompat = androidx.core.os.LocaleListCompat.forLanguageTags(lang);
        AppCompatDelegate.setApplicationLocales(localeListCompat);
}