2010年9月5日日曜日

ListView に昔はまった

ListView と Adapter って、アプリ作る上で大体どんな人も通る道だと思うんですが、
調べても簡単な使い方しか出てこなくて昔苦戦した事がありました。

なんで、ちょっと書き留めておきます。


まず、ListView ってなんぞやってところなんですが、早い話
「画面分の大きさをもったカーソル」
ってイメージが近いんじゃないかと思います。

たぶん(自分がそうだったんですが)普通の技術者が何も考えずに
ListView 使おうとするとエクセルとかそういうUIを思い浮かべて
取りあえずデータブチ込めば見せてくれるんじゃない?
とかって思っちゃうと思うんですが、ListView は少ないリソースしか
使えないモバイルだってことを前提に作られており、全部 ListView のメモリに
データをロードさせるって事をしないんですね。

早い話、やる事は一緒なんですが、データ提供と表示を分ける事で
そこに開発者が手を入れる余地を作ってくれたわけです。

これが解るまで Adapter の存在意義が全く理解できなかったんですよね、俺。


で、どうなっているかというと、大きく分けてAdapter の実装のほうでは
  • データのロードに関する事
  • View の提供に関する事

を実装で工夫することができるんです。

こう書くと「当たり前じゃん!」とか言われそうなんですが、
まぁ当たり前ですね。

ただ、データのロードに関してはまぁそのままなんですけど、「View の提供」に
関する部分は ListView と直接やり取りをする部分で、これは ListView の仕様を
ちゃんと理解していないとドツボにはまる危険があるわけです。

実際自分ははまりました。

最初に書いたように、ListView はカーソルなんです。
リソースの少ないモバイルのメモリを有効に活用するために、View オブジェクトの
再利用の仕方が半端ない。というか結構シビアに実装されているんです。

自分の調べた感じ(あくまで感じ)だと、
  • 始めに表示分 View を新たにロードさせる(つまり null で getView してくる)。
  • 表示部分が動いたら画面表示分+2まで新たにロードさせる。
  • 後は新しくロードはさせず使いまわし!

最初はこれ解らんで実装していたんで、View オブジェクトのプロパティ設定の
タイミングが ListView の期待とそぐわなくて良くわけのわからん問題を引き起こしてました。

わかっちゃえば話は簡単で、view が null で来た時には view のロードを書いて、
プロパティの設定は毎回必ずやる!というルールを守ればいい訳です。


はまったの自分だけかなぁ?普通すぐ気がつく?
下手な小細工をしようとしていた自分が悪かったのかもねー。

0 件のコメント:

コメントを投稿