google-code-prettify

2013-04-15

Spinnerでは、AdapterのgetItemViewType()とgetViewTypeCount()が使えない

ListViewでは、AdapterのgetItemViewType()とgetViewTypeCount()をoverrideすることで、行ごとに違うViewを使うことができる。
しかし、SpinnerではgetItemViewType()とgetViewTypeCount()が呼ばれなく、行ごとに違うViewにするにはListViewとは異なる方法を取る必要がある。

Spinnerのprivateな内部クラスであるDropDownAdapterがAdapterをラップしているのだが、このラッパーは以下のように固定値を返すように実装されていて、setAdapter()でセットしたAdapterのgetItemViewType()とgetViewTypeCount()を呼んでくれない。
        public int getItemViewType(int position) {
            return 0;
        }

        public int getViewTypeCount() {
            return 1;
        }
Spinnerで行ごとに違うViewを使うには、以下のようにすると良い。
  • Viewの中に複数のViewを含めておいて、見せたいViewのVisibilityだけvisibleにし、その他をgoneにする。
  • getView()でconvertViewを再利用するのをやめて、毎回Viewをinflateする。もしくは、convertViewで渡されるViewのタイプを見て、再利用するかどうかを自分で決める。
参考: https://code.google.com/p/android/issues/detail?id=17128

0 件のコメント: