Spinner onItemSelected()不被调用

9
我已经实现了一个ArrayAdapter来填充我的Spinner视图。Spinner可以正常工作,但是Android无法检测到我点击了Spinner中的项。
我遵守了Android文档中Spinner示例中的所有要求,包括将AdapterView.OnItemSelectedListener实现到我的Activity并覆盖了它的两个方法OnItemSelectedListeneronNothingSelected,但是这些方法中没有任何一个Log语句打印,所以它们没有被调用。
我也通过choose_user.onItemSelectedListener = this@PlayerDetails将监听器设置到了我的spinner。 这是我的Activity:
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中选择一个项目时,紧挨着我的Spinner的视图会移动,因此显然已被检测到,但onItemSelected()仍未被调用。


1
我复制了你的代码,它可以正常工作。我确认 onItemSelected() 被调用了。你在里面放了断点吗? - forpas
断点是什么意思? - Zorgan
在AS编辑器中,单击行号右侧的左侧,将出现一个红点。这样就设置了一个断点。然后以调试模式运行应用程序。当代码到达该行时,应用程序将停止。在此处阅读更多信息:https://developer.android.com/studio/debug - forpas
谢谢。我没有设置任何断点,所以不明白为什么 onItemSelected() 没有被调用。 - Zorgan
所以在 onItemSelected() 方法内设置一个断点,按 Shift+F9 运行调试模式。如果当你在下拉列表中进行选择时代码没有停止,那么你可以确定 onItemSelected() 方法没有被调用。 - forpas
我为用户的MutableList var users: MutableList<String> = mutableListOf("Choose User") 设置了初始值,现在onItemSelected()成功被调用。感谢您提供的调试提示。 - Zorgan
3个回答

2

我将users MutableList设置了一个初始值:

最初的回答

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

现在onItemSelected()被成功调用。

最初的回答


0

我相信onItemSelected返回一个数组中项目位置的int值。因此,您必须将其保存为int而不是字符串,然后添加另一个变量作为字符串和array[intSaved]。

编辑

var chosenName = choose_user.onItemSelected("name")

谢谢,我会这样做 - 但首先需要找出为什么 onItemSelected() 根本没有触发。编辑:实际上文档说 getPositionAtPosition(int) 将返回数组中 int 位置的数据,所以从这个意义上讲,我的代码看起来很好: https://developer.android.com/reference/android/widget/AdapterView#getItemAtPosition(int) - Zorgan

0
尝试一下
之前:
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()}")
}

刚试了一下,onItemSelected() 仍然没有被调用。 - Zorgan
“onItemSelected没有被调用”是什么意思? - Jonry Simbolon
里面的日志语句没有显示,所以我认为它没有被调用。不过我已经发布了一个解决方案。 - Zorgan
所以,问题是您的活动中无法调用'method onItemSelected和method onNothingSeleceted'?如果是这样,请使用以下代码:choose_user.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {}如果“object”出现“红色下划线”,请单击Alt+Enter以调用onItemSelected和onNothingSelected方法。 - Jonry Simbolon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接