Android:Spinner下拉列表中所选项目位于顶部位置

时间:2013-01-30 04:41:25

标签: android spinner

Android中的Spinner存在问题。从下拉列表中选择项目将在下次打开时调整该下拉列表的偏移量。因此,例如,如果我在500项下拉列表中选择项目100,则下次打开下拉列表时,项目100将位于列表的顶部。这是我想要的行为。

当我将选择器功能与调用setSelection(int)结合使用时似乎存在问题。通过以下步骤,我似乎打破了下拉式微调器上的偏移系统。

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

我已经看过Spinner和AdapterView中的代码,但我看不到任何我错过的公共电话。这是Spinner中的错误还是我的代码中的错误?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

你试过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. 打开第二个微调器并选择'Venus'(第二个选择)。
  2. 打开第二个微调器,然后按回去解除
  3. 5秒后,postDelayed呼叫导致'海王星'(第七选择)被选中
  4. 打开微调器并且偏移正确