【发布时间】:2012-04-09 10:33:56
【问题描述】:
我正在寻找一种在 Android 微调器小部件中隐藏一个项目的方法。这将允许您模拟没有选择任何项目的微调器,并确保始终为每个选择的项目调用 onItemSelected() 回调(如果隐藏的项目是“当前”项目)。通常,微调器中始终有一项不会生成回调,即当前项。
stackoverflow 上有一些关于如何禁用(灰显)项目的代码,而不是如何完全隐藏项目,就好像它们不存在一样。
经过大量实验后,我想出了一个可以在各种新旧 Android 平台上运行的有点骇人听闻的解决方案。它有一些难以察觉的轻微外观缺陷。除了“不要用微调器这样做”之外,我仍然希望听到更官方的解决方案。
这总是隐藏微调器中的第一个项目,但可以很容易地扩展为隐藏任意项目或多个项目。在微调器项目列表的开头添加一个包含空字符串的虚拟项目。您可能希望在微调器对话框打开之前将当前微调器选择设置为项目 0,这将模拟未选择的微调器。
带有 ArrayAdapter 方法覆盖的 Spinner 设置示例:
List<String> list = new ArrayList<String>();
list.add(""); // Initial dummy entry
list.add("string1");
list.add("string2");
list.add("string3");
// Populate the spinner using a customized ArrayAdapter that hides the first (dummy) entry
ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, list) {
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent)
{
View v = null;
// If this is the initial dummy entry, make it hidden
if (position == 0) {
TextView tv = new TextView(getContext());
tv.setHeight(0);
tv.setVisibility(View.GONE);
v = tv;
}
else {
// Pass convertView as null to prevent reuse of special case views
v = super.getDropDownView(position, null, parent);
}
// Hide scroll bar because it appears sometimes unnecessarily, this does not prevent scrolling
parent.setVerticalScrollBarEnabled(false);
return v;
}
};
dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mySpinner.setAdapter(dataAdapter);
【问题讨论】:
-
您在其他互联网上发现了什么?到目前为止你尝试过什么?
-
对不起啦,我不知道该怎么办。
-
不错的解决方案!但我认为
tv.setVisibility(View.GONE);行是不必要的。至少在 Android 4.4.2/KitKit 上(在 LG/Google Nexus 4 上)将其注释掉似乎没有任何(视觉)差异。 -
这个问题的答案效果很好..
-
这可能不是一个改进,但我在位置 0 的 textView 上使用了
setTag(1),然后使用convertView.getTag() != null来确定重用的视图是为位置 0 创建的高度为 0 的视图还是用于其他微调器项目的普通视图。这样我有时可以使用super.getDropDownView(position, convertView, parent)而不是总是创建一个新视图。