Androidスピナーウィジェットで1つのアイテムを非表示にする方法を探しています。これにより、アイテムが選択されていない状態でスピナーをシミュレートでき、選択されたすべてのアイテムに対して常にonItemSelected()コールバックが確実に呼び出されます(非表示のアイテムが「現在の」アイテムである場合)。通常、スピナーには常に、コールバックを生成しない1つの項目、つまり現在の項目があります。
アイテムを無効にする(グレー表示する)方法については、stackoverflowにコードがいくつかありますが、アイテムが存在しないかのように完全に非表示にする方法はありません。
多くの実験の後、私はさまざまな新旧のAndroidプラットフォームで動作する、ややハックっぽいソリューションを思いつきました。それには気づきにくいいくつかの小さな化粧品の欠点があります。「スピナーでそれをしないでください」以外の、より公式な解決策についてはまだ聞きたいです。
これは常にスピナーの最初のアイテムを非表示にしますが、任意のアイテムまたは複数のアイテムを非表示にするようにかなり簡単に拡張できます。スピナーアイテムのリストの先頭に、空の文字列を含むダミーアイテムを追加します。スピナーダイアログが開く前に、現在のスピナー選択をアイテム0に設定すると、選択されていないスピナーがシミュレートされます。
ArrayAdapterメソッドをオーバーライドしたスピナーのセットアップ例:
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)
、常に新しいビューを作成する代わりに、時々使用できるようにするためでした。