我正在寻找一种在Android微调器小部件中隐藏一个项目的方法。这将允许您模拟不选择任何项目的微调器,并确保始终为选中的每个项目调用onItemSelected()回调(如果隐藏的项目是“当前”项目)。通常,微调器中总是有一个不产生回调的项,即当前项。
在stackoverflow上有一些代码说明如何禁用(变灰)项目,但没有如何完全隐藏项目(好像它们不存在一样)。
经过大量的试验,我提出了一种有点hack-ish的解决方案,该解决方案可以在各种新旧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上)上,注释掉似乎并没有任何(视觉上的)差异。
setTag(1)
在textView的位置0上使用过,然后用来convertView.getTag() != null
确定重用的视图是为位置0创建的0高度视图还是用于其他微调器项目的普通视图。这样一来,我super.getDropDownView(position, convertView, parent)
有时可以使用而不是总是创建一个新视图。