我在Android中的Spinner有问题。从下拉列表中选择一个项目将在下次打开该下拉列表时调整该下拉列表的偏移量。因此,例如,如果我在 500 项下拉列表中选择项目 100,则下次打开下拉列表时,项目 100 将位于列表顶部。这就是我想要的行为。
当我将选择器功能与调用setSelection(int)
相结合时似乎存在问题。通过以下步骤,我似乎已经破坏了下拉微调器上的偏移系统。
- 打开微调器并选择第二个项目。
- 再次打开微调器,这次不选择任何内容即可将其关闭。
- 在数值大于 2 的微调器上调用
setSelection(int)
。 - 第三次打开微调器。请注意,偏移量与步骤 1 中的偏移量相同。
我已经查看了Spinner和AdapterView中的代码,但是我看不到我错过的任何公共呼叫。这是微调器中的错误还是我的代码中的错误?
你试过public void setSelection (int position, boolean animate)
吗? 我还没有尝试过,但我认为将true
作为第二个参数传递应该使列表滚动到所选位置。 另一种方法是计算滚动偏移量(项目高度 x 所选项目位置)并调用 setDropDownVerticalOffset
。
更新:我尝试修改 API 演示中的微调器示例以使用setSelection(7, true)
,按照您在问题中提供的 4 个步骤进行操作时,它似乎有效。 我刚刚添加了一个处理程序并修改了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);
}
我测试如下:
- 打开第二个微调器并选择"金星"(第二个选择)。
- 打开第二个微调器,然后按"返回"关闭
- 5 秒后,postDelay 调用导致选择"海王星"(第七个选择)
- 打开微调器,偏移正确
您可以通过将列表发送到适配器来解决这个问题。选择项目后,对列表进行排序,然后使用适配器的 notifyDataSetChanged() 函数。当您再次调用 setSelection(int) 函数时,对列表进行排序并使用 notifyDataSetChanged() 函数。