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で色を指定すれば、動的にリストの文字色が変更できます。

この記事へのコメント

いなら
2011年10月25日 23:13
こんちには。
ListViewの動的な文字色変更がうまく実装できずに困っております。
よろしければ、具体的なソースを見せて頂けませんでしょうか?
よろしくお願いいたします。
T_T
2011年11月04日 10:16
いなら様

コメントをありがとうございます。
手順の1~4の通り作成すればできるはずです。
具体的なソースですが、1~3のサンプルを本文に記載します。
どこまでできているのかも、要件も分からないので、
あとは工夫をしてみてください。
いなら
2012年02月03日 23:02
T_T様

返信が遅くなってしまいました。申し訳ありません。
ソースを掲載して頂きありがとうございました。
無事、文字色を変更する事ができました!
どうやらsetTextViewに対して、color.xmlで定義した色のリソースIDを渡していたのが悪かったみたいです。
setTextView(R.color.customColor)とかやってました……

この記事へのトラックバック

  • paintの色を指定する

    Excerpt: Viewクラスのpaintではpaint.setColor(); を指定することで簡単に色の変更ができます 使用できる色は以下の通りです Color.BLACK Color.BLUE Color.C.. Weblog: 初心者の初心者のためのAndroidアプリ開発! racked: 2012-03-28 16:32
  • 大同化?培?

    Excerpt: http://hi.baidu.com/dtdear3 大同 Weblog: 大同化?培? racked: 2013-05-21 03:07
  • オークリー サングラス

    Excerpt: androidのListViewの文字色を動的に変更する 涙目ブログ/ウェブリブログ Weblog: オークリー サングラス racked: 2013-07-05 18:33