onItemSelected для spinner работает не корректно
Спиннер служит для смены языка по клику.
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 без картинок- все работало четко как и задумывалось. Поэтому сам грешу на кастомный адаптер - возможно где то что то не учел.
Источник: Stack Overflow на русском