how to track clicking on spiner with castomadapter

31 Views Asked by At

I need to catch a click on a spinner element and based on this change the elements of another spinner clicking on the spinner element does not work. OnItemSelectedListener is not called. something is wrong with castomadapter, I can't figure out what the problem is

xml spiner

  <Spinner
        android:id="@+id/clientSpinner"
        android:spinnerMode="dialog"
        android:layout_marginTop="16dp"
        style="@style/spinner_margins"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

adapter in this fragment, I call the creation of a castomadapter

  val clientsAdapter =
        CustomArrayAdapter<Client>(requireContext(), android.R.layout.simple_spinner_item, R.layout.spinner_item) {
            it.name
        }
    binding.clientSpinner.adapter = clientsAdapter

castomadapter my class

class CustomArrayAdapter<T>(
    context: Context,
    @LayoutRes private val layoutResource: Int,
    @LayoutRes private val dropdownLayoutResource: Int = layoutResource,
    @IdRes private val textViewResourceId: Int = 0,
    private val show: (T) -> String
) : ArrayAdapter<T>(context, layoutResource) {

    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        val view = createViewFromResource(convertView, parent, layoutResource)
        return bindData(getItem(position)!!, view)
    }

    override fun getDropDownView(position: Int, convertView: View?, parent: ViewGroup): View {
        val view = createViewFromResource(convertView, parent, dropdownLayoutResource)
        return bindData(getItem(position)!!, view)
    }

    private fun createViewFromResource(
        convertView: View?, parent: ViewGroup, layoutResource: Int
    ): TextView {
        val context = parent.context
        val view =
            convertView ?: LayoutInflater.from(context).inflate(layoutResource, parent, false)
        return try {
            if (textViewResourceId == 0) view as TextView
            else {
                view.findViewById(textViewResourceId) ?: throw RuntimeException(
                    "Failed to find view with ID " + "${
                        context.resources.getResourceName(
                            textViewResourceId
                        )
                    } in item layout"
                )
            }
        } catch (ex: ClassCastException) {
            Timber.e("You must supply a resource ID for a TextView")
            throw IllegalStateException(
                "ArrayAdapter requires the resource ID to be a TextView", ex
            )
        }
    }

    private fun bindData(value: T, view: TextView): TextView {
        view.text = show(value)
        return view
    }
}

fun <T> ArrayAdapter<T>.bindItems(items: List<T>) {
    clear()
    addAll(items)
    notifyDataSetChanged()
}

fun <T> Flow<Int>.mapToItems(adapter: ArrayAdapter<T>): Flow<T> = transform {
    adapter.getItem(it)?.let { item -> emit(item) }
}
enter code here
    enter code here

onItemSelectedListener pressing method

binding.clientSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
            override fun onItemSelected(
                parent: AdapterView<*>?, view: View?, position: Int, id: Long
            ) {
                Log.e("S", "нажатие")
                trainingsAdapter =
                    CustomArrayAdapter<Training>(requireContext(), android.R.layout.simple_spinner_item, R.layout.spinner_item) {
                        it.name + it.id?.let { it1 -> getStringTreningOnCurrent(it1) }
                    }.also {
                        binding.trainingSpinner.adapter = it
                    }

            }

            override fun onNothingSelected(parent: AdapterView<*>?) {

                Log.e("Sd : ", "  ")
            }
        }

0

There are 0 best solutions below