android - 不需要的 onItemSelected 调用

标签 android android-spinner

我已经用一些值初始化了 36 个微调器。我和他们一起使用了 onItemSelectedListener。像往常一样,用户可以与这些微调器交互,触发 onItemSecected 函数。

一个问题是调用是在初始化期间进行的,但我在这里找到了解决方案,并避免在执行 onItemSelected 内的代码之前使用全局变量“count”并检查 count 是否 > 36。

我的问题是: 用户可以选择单击一个名为“上一个”的按钮,在该按钮上我必须重置一些微调器值。

我尝试在重置微调器之前将 count 的值更改为 0,然后在重置后将其更改回 37,但我了解到 onItemSelected 仅在所有其他函数执行完毕后才会调用,所以它是即使微调器值在用户选择后立即设置,也称为 AFTER 计数已更改回 37。

我需要在不触发 onItemSelected 函数的情况下反复刷新一些微调器。谁能帮我找到解决方案?谢谢。

最佳答案

我找到了一个简单且我认为优雅的解决方案。 使用标签。 我首先创建了一个名为“tags”的新 XML 文件并放入以下代码:

<resources xmlns:android="http://schemas.android.com/apk/res/android">
  <item name="pos" type="id" />
</resources>

每当我自己使用 spin.setSelection(pos) 时,我也会使用 spin.setTag(R.id.pos, pos),所以我正在设置当前作为标签的位置。

然后,在 onItemSelected 中,我只执行代码 if(spin.getTag(R.id.pos) != position),其中 position 是函数提供的位置变量。 这样,我的代码只有在用户进行选择时才会执行。 由于用户做出了选择,标签还没有更新,所以处理完成后,我将标签更新为spin.setTag(R.id.pos, position)

注意:始终使用相同的适配器很重要,否则“位置”变量可能指向不同的元素。

编辑: 正如 kaciula 指出的那样,如果您不使用多个标签,则可以使用更简单的版本,即 spin.setTag(pos)spin.getTag() 无需 XML 文件。

关于android - 不需要的 onItemSelected 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21747917/

相关文章:

android - 使用 run-as 在 ADB shell 中复制文件

android - 仅更改 AlertDialog 中的字体大小

java - 双击 : zoom on Android MapView?

java - Android:Spinner onItemSelect 膨胀另一个 Spinner

android - 在繁忙的 ListView 中更新 TextView 而不会失去 Spinner 焦点

android - 只想在运行单元测试时运行自定义 gradle 任务

android - 我的 ActionBarActivity 布局中的奇怪行为

android - 带有自定义适配器的微调器不会在选择时消失

android - 在 "Adapter"上用于两个(或更多)父 View ?

Android 简单的微调器项目