Umi Uyuraのブログ

プログラミング関連の作業ログ

Titanium.UI.ListViewのイベントまわりを調べてみた

ふと試してみたところ、Titanium.UI.ListViewのドキュメントに掲載されていない swipe イベントが取れたので、もしかして他の使えるのかも?と思って調べてみました。

ドキュメントに掲載されているクリックイベント以外だと、スワイプと長押しあたりが使えると広がるな―などと思って始めたのですが、、、まあ結論を書くと、swipe イベント自体は発行されるものの、個々のListItemのアクションとしては使えないものだったのでした。

ということを調べたメモです。

確認した環境

確認したこと

  • ListSection/ListItemでイベントが取れるのか?
  • どのイベントを受け取ることができるのか?

ListSection/ListItemでイベントが取れるのか?

そもそもListSectionやListItemでイベントは取れないのか?という点を念のため再確認。

それぞれに addEventListener をしたところ not a function になってしまったので、ここはやはりListViewでハンドリングするしかなさそう。

もう半分答えが出た感じ。

どのイベントを受け取ることができるのか?

公式ドキュメント上で特定のListItemを識別するようなイベント itemclick のみですが、他のViewなどで持っているものでListItemへの操作をハンドリングできそうなイベントを見繕って調べてみました。

Alloyベースのプロジェクトを作って、思いついたイベントハンドラを片っ端から追加して、ポチポチさわってみた結果は以下のような感じ。

イベント iOS Android 補足
itemclick -
swipe イベントは発生するが、 sectionIndexitemIndex は取れない ※1
click - - 発生しない
singleclick - - 発生しない
dblclick - Androidは、ListItemがない部分でのみ発生する
longclick - - 発生しない
longpress iOSは発生するが、 itemclick も発生する
Androidは、ListItemがない部分でのみ発生する
singletap iOSは発生するが、 itemclick も発生する
Androidは、ListItemがない部分でのみ発生する
doubletap - - 発生しない
twofingertap iOSは発生するが、 itemclick も発生する
Androidは、ListItemがない部分でのみ発生する

というわけで、やはりListViewで特定のListItemへの操作に対応するためのイベントは itemclick だけ。要するに、ListViewのイベントということですね。

ちなみに、Androidで受け取れる itemclick 以外のイベントで sectionIndexitemIndex が取れることがあったのですが、その操作以前にクリックしているListItemの情報が取れてしまっているだけで、その操作に対応した情報ではありませんでした(紛らわしい!)

まとめ

標準のListViewのみだと、凝った操作はできない印象。

他の方法としては、ItemTemplateにいろいろViewを設置して、そこでイベントハンドリングすれば取れそうな気もしますが、もともとやろうとしていることから外れているので、いったんここまで。

調べるのに作ったプロジェクトは これ

Appcelerator Titanium Smartphone App Development Cookbook - Second Edition

Appcelerator Titanium Smartphone App Development Cookbook - Second Edition