androidのListViewの文字色を動的に変更する

めんどくさいですね(T_T)
TextViewには文字色を変更するAPIがあるので、ListViewも同じだと思ったら
1行程度の追加ではできないようです。

XMLで静的に色を設定するのと違い、動的に変更するには
androidが提供しているJavaのAPIを使用する必要があります。
ところが、ListViewにはそのようなAPIがないので、以下の対応が必要になります。

1.ArrayAdapterを継承したクラスを作成する。
2.上記のクラスに文字色を設定するAPIを追加し、文字色を保持するように作成する。
3.上記のクラスでgetViewメソッドをオーバーライドし、TextViewを引数から取得し、
  文字色を変える。
4.上記のアダプタクラスをListView#setAdapterで設定する。

ちなみにArrayAdapterにandroid.R.layout.simple_list_item_1を使用している場合は、
android.R.id.text1というIDのTextViewが上記の3.で取得できるので、
独自でXMLを作成する必要はありません。

それから、大部分の挙動はArrayAdapterクラスにやらせるので、
コンストラクタやgetView作成時にはsuperを忘れないようにして下さい。


めんどくさいですけど、これは3.のgetViewが
画面に表示されるときのみ呼ばれるので、
何千行のリストでも、画面表示する項目に対してのみメモリが
使用され、効率よくメモリを使用するために必要なのだそうです。
内部でフライウェートパターンでも持っているのでしょう。

(2011年11月4日 追記)
ArrayAdapterを継承したクラスについてサンプルソースを貼ります。
動作確認もコンパイルもしてませんが、イメージをつかんで頂ければ幸いです。
(T_T)

----------------------------------------------------
public class ArrayAdapterSample extends ArrayAdapter {

private int mTextColor;
private int mBgColor;

public ArrayAdapterSample( Context context,
int textViewResourceId,
List objects,
int textColor,
int bgColor ) {
super( context, textViewResourceId, objects );
mTextColor = textColor;
mBgColor = bgColor;
}

public void setTextColor( int bg, int fg ) {
mTextColor = fg;
mBgColor = bg;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = super.getView( position, convertView, parent );

TextView tv = (TextView)v.findViewById( android.R.id.text1 );
tv.setTextColor( mTextColor );
tv.setBackgroundColor( mBgColor );
return v;
}
}
----------------------------------------------------

上記クラスのオブジェクトをListView#setAdapterで設定し、
ArrayAdapterSample#setTextColorで色を指定すれば、動的にリストの文字色が変更できます。

"androidのListViewの文字色を動的に変更する" へのコメントを書く

お名前
メールアドレス
ホームページアドレス
コメント