Spinner onItemSelected () не вызывается - PullRequest
8 голосов
/ 21 марта 2019

Я реализовал ArrayAdapter для заполнения моего Spinner представления.Spinner работает нормально, однако андроид не обнаруживает, когда я нажимаю на элемент в счетчике.

Я выполнил все требования из примера в документах для Android , включая реализацию AdapterView.OnItemSelectedListener для моей активности и переопределение двух методов OnItemSelectedListener и onNothingSelected, однакони одно из моих Log операторов в этих методах не печатается, поэтому они не вызываются.

Я также установил слушатель для моего счетчика через choose_user.onItemSelectedListener = this@PlayerDetails.

Вотмоя деятельность:

class PlayerDetails : AppCompatActivity(), View.OnClickListener, TextWatcher, AdapterView.OnItemSelectedListener {
    val TAG: String = "PlayerDetails"
    val FirebaseTAG: String = "FirebaseDebug"

    var numOfPlayers: Int = 1
    var currentPlayer: Int = 1

    var name: String = ""
    var age: Int = 0
    var genderId: Int = 0
    var genderResult: String = ""

    val db = FirebaseFirestore.getInstance()
    var users: MutableList<String> = mutableListOf()

    private lateinit var binding: ActivityPlayerDetailsBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val sharedPref = this@PlayerDetails.getPreferences(Context.MODE_PRIVATE)
        val applicationID: String? = sharedPref.getString("applicationID", null)

        binding = DataBindingUtil.setContentView(this, R.layout.activity_player_details)

        if (applicationID != null) {

            db.collection("phones").document(applicationID)
                .collection("users")
                .get()
                .addOnSuccessListener { result ->

                    for (document in result){
                        val name = document.get("name").toString()
                        users.add(name)
                    }
                }

            Log.d(FirebaseTAG, users.toString())
            val spinnerAdaptor = ArrayAdapter<String>(this@PlayerDetails, android.R.layout.simple_spinner_item, users)
            spinnerAdaptor.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
            choose_user?.adapter = spinnerAdaptor
            choose_user.onItemSelectedListener = this@PlayerDetails
        }

        val intent = getIntent()
        numOfPlayers = intent.getIntExtra("number_of_players", 1)
        next_details.setOnClickListener(this)
        player_name.addTextChangedListener(this)
        player_age.addTextChangedListener(this)
        gender.setOnCheckedChangeListener(object: RadioGroup.OnCheckedChangeListener {
            override fun onCheckedChanged(radiogroup: RadioGroup, checked: Int) {
                if (fieldsArePopulated()) next_details.visibility = View.VISIBLE
            }
        })

    }

    override fun onItemSelected(parent: AdapterView<*>?, name: View?, position: Int, rowId: Long) {
        val chosenName: String = parent?.getItemAtPosition(position).toString()
        Log.d("ChosenName", chosenName)
        Log.d("adapterclicked", "adapterclicked")

    }

    override fun onNothingSelected(parent: AdapterView<*>?) {
        Log.d("Nothing", "NOTHINGCALLED")
    }

...

Есть идеи, в чем проблема?

Кроме того, когда я выбираю элемент в Spinner, вид рядом с моим счетчиком перемещается, так что, очевидно,обнаружен, но onItemSelected() все еще не вызывается.

Ответы [ 3 ]

2 голосов
/ 24 марта 2019

Я установил начальное значение в users MutableList:

var users: MutableList<String> = mutableListOf("Choose User")

и теперь onItemSelected() успешно вызывается.

0 голосов
/ 23 марта 2019

попробуйте

до:

override fun onItemSelected(parent: AdapterView<*>?, name: View?, position: Int, rowId: Long) {
    val chosenName: String = parent?.getItemAtPosition(position).toString()
    Log.d("ChosenName", chosenName)
    Log.d("adapterclicked", "adapterclicked")

}

после:

override fun onItemSelected(parent: AdapterView<*>?, name: View?, position: Int, rowId: Long) {
    val chosenNameTextView = parent!!.getChildAt(0) as TextView
    Log.e("MainActivity","choose Spin : ${chosenNameTextView.text.toString()}")
}
0 голосов
/ 21 марта 2019

Я почти уверен, что onItemSelected возвращает int позиции элемента в массиве. Таким образом, вы должны сохранить это как int вместо строки, а затем добавить другую переменную, которая использует строку и массив [intSaved]

Редактировать

var chosenName = choose_user.onItemSelected("name")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...