Adapterを継承したクラスで、getView(...)に色を変える処理を書き、これをSpinnerにsetAdapter()してやることでドロップダウンアイテムの前景色を変えられません。変えられると思って試してみたところ、これで変わるのはドロップダウンアイテムの方ではなくて、Spinner本体(未展開。折り畳まれている状態のもの)の方でした。
getView(...)の代わりにgetDropDownView(...)をオーバーライドしてやると上手く行きます。
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
View view = convertView;
~ 中略 ~
String item = this.getItem(position);
CheckedTextView textView = (CheckedTextView) view;
textView.setText(item);
textView.setTextColor(Color.BLACK); // ※1
if (exists(item)) {
textView.setTextColor(Color.RED);
}
return view;
}
public View getDropDownView(int position, View convertView, ViewGroup parent) {
View view = convertView;
~ 中略 ~
String item = this.getItem(position);
CheckedTextView textView = (CheckedTextView) view;
textView.setText(item);
textView.setTextColor(Color.BLACK); // ※1
if (exists(item)) {
textView.setTextColor(Color.RED);
}
return view;
}
ファイルのパスを選択するSpinnerに設定することを前提としたAdapterです。
表示したいpositionにある文字列(ファイルパス)を取得し、これのキャッシュが存在する場合は文字列を赤くします。
※1のところで少し躓きました。
元の文字色が黒だから設定する必要ないだろうと思ってこれを書かずに走らせたところ、キャッシュが存在しないパスまで赤くなります。
Adapterに登録してある項目の個数分、getDropDownView(...)が呼ばれる度に別々のViewを生成するのだと思っていましたが、そうではなくて、
いくつか生成したら内部ではそれを使いまわしているようです。そういった理由で、この行を書かない場合、いったん文字色が赤くなったViewはその後ずっと赤いままとなってしまい、意図しない表示となってしまいます。
この記事に対するコメント・トラックバック [4件]
2. Dylan — 2012/10/06@01:36:22
3. Melissa — 2012/10/07@19:52:19
4. Diego — 2012/10/22@23:35:39