Android微调器中的重复项目

Posted

技术标签:

【中文标题】Android微调器中的重复项目【英文标题】:Repeated items in Android spinner 【发布时间】:2021-12-28 07:59:06 【问题描述】:

我有一个微调器,我在 onCreate 活动中调用它。微调器从 Room 数据库中获取数据。当我第一次运行微调器时,数据显示正确。但是当我回到微调器时,我可以多次看到相同的项目。例如。应该只有 11、12、13、14 等值,而不是 11 或 12 两次(有时甚至更多次)。

我在 onCreate Activity 中调用了函数 initSpinnerData()。我在 onResume 活动中尝试过,它显示了相同的结果。

private fun initSpinnerData()
        val allDevices = this?.let 
            ArrayAdapter<Any>(it, R.layout.simple_item_spinner, R.id.tv_simple_item)
        
        zebraViewModel.getAllZebra()
            .observe(this,  devices ->
                devices?.forEach
                    allDevices?.add(it)
                
             )
        spinner3.adapter = allDevices
        spinner3.onItemSelectedListener = object : AdapterView.OnItemSelectedListener
            override fun onItemSelected(parent: AdapterView<*>?, p1: View?, position: Int, p3: Long) 
                if (parent != null) 
                    val idZebraString = parent.getItemAtPosition(position).toString()
                    idZebra = idZebraString.toInt()
                
            
            override fun onNothingSelected(p0: AdapterView<*>?) 
                Toast.makeText(this@ZebraActivity, "You must choose some item", Toast.LENGTH_LONG).show()            
        
    

【问题讨论】:

【参考方案1】:

那是因为 .observe 方法,在每个项目开始时和单个模型更改时都会调用该方法,但无论如何您都在调用 add,从而导致重复

尝试检查适配器中是否已存在此新项目,如果是,则不执行任何操作或删除旧项目并添加新项目。例如

            devices?.forEach
                if (allDevices.getPosition(it) < 0) allDevices?.add(it)
            

如果您有正确的模型声明(toString() 和哈希码),这应该可以工作

【讨论】:

以上是关于Android微调器中的重复项目的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的微调器中使用 getItemAtPosition 从谷歌地图中的火力基地使用 android studio

在 Android 中动态禁用微调器项目

从 PHP MySql 填充 Android 微调器

Android - 如何在一个活动中禁用多个微调器的特定项目

Android Spinner重复项仅提供第一个重复项的位置

Android:以编程方式从数组创建微调器