7

我对 Android 中的 Spinner 有疑问。从下拉列表中选择一个项目将在下次打开该下拉列表时调整它的偏移量。例如,如果我在 500 项下拉列表中选择第 100 项,下次我打开下拉列表时,第 100 项将位于列表顶部。这是我想要的行为。

当我将选择器功能与调用setSelection(int). 通过以下步骤,我似乎打破了下拉微调器上的偏移系统。

  • 打开 Spinner 并选择第二个项目。
  • 再次打开 Spinner,这次关闭它而不选择任何内容。
  • setSelection(int)使用大于 2 的值调用Spinner。
  • 第三次打开微调器。请注意,偏移量与步骤 1 中的相同。

我查看了 Spinner 和 AdapterView 中的代码,但看不到任何我错过的公共调用。这是 Spinner 中的错误还是我的代码中的错误?

4

2 回答 2

2

你试过了public void setSelection (int position, boolean animate)吗?我没有尝试过,但我认为true作为第二个参数传递应该会使列表滚动到所选位置。另一种选择是计算滚动偏移量(项目高度 x 选定项目位置)并调用setDropDownVerticalOffset.

更新:我尝试修改 API 演示中的 Spinner 示例以使用setSelection(7, true),并且在遵循您在问题中提供的 4 个步骤时它似乎可以工作。我只是添加了一个Handler并修改showToast如下:

private final Handler handler = new Handler();

void showToast(CharSequence msg) {
    Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
    handler.postDelayed(new Runnable(){
        public void run() {
            Toast.makeText(Spinner1.this, "auto setting", Toast.LENGTH_SHORT).show();
            Spinner s2 = (Spinner) findViewById(R.id.spinner2);
            s2.setSelection(7, true);
        }
    }, 5000);
}

我测试如下:

  1. 打开第二个微调器并选择“维纳斯”(第二个选择)。
  2. 打开第二个微调器,然后按返回关闭
  3. 5 秒后,postDelayed 调用导致选择“Neptune”(第七个选择)
  4. 打开微调器,偏移量正确
于 2013-02-08T15:11:24.640 回答
1

我认为您可以通过将列表发送到适配器来解决该问题。选择项目后,对列表进行排序,然后使用适配器的 notifyDataSetChanged() 函数。当您再次调用 setSelection(int) 函数时,对 List 进行排序并使用 notifyDataSetChanged() 函数。

于 2013-02-08T09:08:37.727 回答