Spinner возвращает из адаптера слишком много элементов
Есть Spinner, к нему есть адаптер. Мне надо получать выбранный итем, точнее - забирать из него текст. Для этого написал лиснер, который отправляет данные при отработке адаптера. Но я что то сделал не верно, так как лиснер возвращает мне не один выбранный элемент, а все элементы спинера по очереди. Вот код адаптера:
class SpinnerAdapter(
context: Context,
resId: Int,
var daysList: List<String>, val onSpinnerItemClickListener: OnSpinnerItemClickListener
) :
ArrayAdapter<String>(context, resId, daysList) {
fun addAll(daysList: List<String>) {
this.daysList = daysList as MutableList<String>
notifyDataSetChanged()
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
return getCustomView(position, convertView, parent)
}
override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View {
return getCustomView(position, convertView, parent)
}
private fun getCustomView(position: Int, convertView: View?, parent: ViewGroup) =
LayoutInflater.from(parent.context)
.inflate(R.layout.item_spiner_row, parent, false).apply {
val textView = this.findViewById<TextView>(R.id.dayOfWeek)
textView.text = daysList[position]
onSpinnerItemClickListener.onSpinnerItemClick(daysList[position])
}
interface OnSpinnerItemClickListener {
fun onSpinnerItemClick(month: String)
}
}
Строкой ниже я отправляю в активити текст по идее выбранного итема. Но, получается, что сам метод getCustomView отрабатывает на каждый итем, который есть в списке спиннера. А ка сделать, что бы вернул именно по выбранному элемента спиннера инфу?
onSpinnerItemClickListener.onSpinnerItemClick(daysList[position])
Ответы (1 шт):
В строке onSpinnerItemClickListener.onSpinnerItemClick(daysList[position]) вы да, явно вызываете срабатывание слушателя при каждой отрисовке каждого отображаемого/изменяемого элемента.
Помимо того, что нужный вам слушатель и так должен быть у спиннера и может быть повешен на оный извне адаптера, вам надо вызывать слушатель только в момент, например, нажатия, а не отрисовки. Например так:
textView.setOnClickListener { onSpinnerItemClickListener.onSpinnerItemClick(daysList[position]) }