Преобразование пользовательской библиотеки блесны из Java для использования с Kotlin.Проблемы со Слушателем - PullRequest
0 голосов
/ 19 декабря 2018

Я работаю над небольшим приложением для Android.Приложение использует пару спиннеров.Я хочу иметь возможность использовать счетчики, но я хочу, чтобы первая опция в Spinner была подсказкой и не выбиралась.

Я нашел несколько обходных путей здесь в StackOverflow.Но не совсем то, что я ищу.

Я нашел следующий репозиторий на Github: https://github.com/sadra/AwesomeSpinner

И это именно то, что я хочу сделать.Но он написан на Java, а мое приложение написано на Kotlin.Я знаю, что они должны работать вместе, но я не могу заставить это работать.Я почти уверен, что проблема заключается в моей неопытности, а не в репозитории или Kotlin v. Java.

Это мой Spinner.Он живет во фрагменте в onViewCreated ().

//String array
val companyNames = resources.getStringArray(R.array.companyName_array)

var nameSpinner = binding.spinnerCustomerName

//Adapter for spinner
nameSpinner.adapter = ArrayAdapter(activity, android.R.layout.simple_spinner_dropdown_item, companyNames)

//item selected listener for spinner
nameSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
    override fun onNothingSelected(p0: AdapterView<*>?) {
        TODO("not implemented yet")
    }

    override fun onItemSelected(p0: AdapterView<*>?, p1: View?, p2: Int, p3: Long) {
        selectedCompanyName = companyNames[p2]
        Log.v(LOG_TAG, "Spinner Item Selected --> $companyNames")
    }
}

Документы AwesomeSpinner говорят так:

AwesomeSpinner nameSpinner = (AwesomeSpinner) findViewById(R.id.spinner_customerName);

В моем приложении в Котлине я делаю:

var nameSpinner: AwesomeSpinner = binding.spinnerCustomerName as AwesomeSpinner

Вот тут и начинаются мои проблемы.Я не могу понять, как правильно настроить адаптер и прослушиватель.Я пробовал все возможные способы, но что-то упустил или что-то делаю не так.

Работаю над этим и не могу правильно установить адаптер.

companyNamesAdapter.setAdapter(nameSpinner, 0)

Выше указано неверное,.setAdapter остается разрешаемым ресурсом.

Это исправленный и рабочий код:

//String array
var nameSpinner: AwesomeSpinner = binding.spinnerCustomerName

//Adapter for spinner
var companyNamesAdapter = ArrayAdapter.createFromResource(activity, 
R.array.companyname_array, android.R.layout.simple_spinner_dropdown_item)

nameSpinner.setAdapter(companyNamesAdapter, 0)

//item selected listener for spinner
nameSpinner.setOnSpinnerItemClickListener(
    object:AwesomeSpinner.onSpinnerItemClickListener<String>() {

    nameSpinner.setOnSpinnerItemClickListener { position: Int, itemAtPosition ->
        selectedCompanyName = nameSpinner.selectedItem[position].toString()
        Log.v(LOG_TAG, "Spinner Item Selected --> $companyNamesAdapter and $itemAtPosition" )
    }

Мой XML настроен и выглядит нормально.Как и зависимости и репозитории в Gradle.

1 Ответ

0 голосов
/ 19 декабря 2018

Только что скопировал код из руководства и все работает нормально в Kotlin:

    val spinner = findViewById<AwesomeSpinner>(R.id.spinner)
    val categories = listOf("Automobile", "Ariplane")
    val categoriesAdapter = ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, categories)
    spinner.setAdapter(categoriesAdapter)
    spinner.setOnSpinnerItemClickListener { position, itemAtPosition ->
        Toast.makeText(this, "Selected on $position with $itemAtPosition", Toast.LENGTH_SHORT).show()
    }

Помогает ли это или я скучаю по тебе?

UPD.Похоже, вы перепутали адаптер и вертушку: companyNamesAdapter.setAdapter(nameSpinner, 0).Это должно быть nameSpinner.setAdapter(companyNamesAdapter, 0)

...