http://developer.appcelerator.com/question/46261/tableview-setonitemlongclicklistener-android
と同等の要件です。(元記事は解決していないですが、、、)
こんなテーブルを作ったとします。
var tableView = Ti.UI.createTableView(); var tableRow1 = Titanium.UI.createTableViewRow(); var tableRow1Label = Titanium.UI.createLabel({text:"label1"}); tableRow1.add(tableRow1Label); var tableRow2 = Titanium.UI.createTableViewRow(); var tableRow2Label = Titanium.UI.createLabel({text:"label2"}); tableRow2.add(tableRow2Label); tableView.appendRow(tableRow1); tableView.appendRow(tableRow2);
TableViewにおいて、どのrowが選択されたかは、addEventListner('click')で取得できます。
tableView.addEventListener('click', function(e) { alert(e.index); // 何列目が選択されたかを表示 }
Androidには、長押しという概念ものがあります。
長押しすると、対象についてのサブメニュー(保存とかリンクを開くとか)が表示されるのが一般的です。
で、TableViewでどのrowが長押しされたか、を取得したい、ということがあるのです。よく。
現状、TitaniumではAndroidの長押しはeventとして定義されていません・・・
そのため、通常は以下で長押しを検知するようです。
var touched = false; tableview.addEventListener('click', function(e) { touched = false; }); tableview.addEventListener('touchstart', function(e){ touched = true; setTimeout(function(){ if (touched) alert("Long press"); },1000); }); tableview.addEventListener('touchmove', function(e){ touched = false; }); tableview.addEventListener('touchend', function(e){ touched = false; });
ですが、上記のtouchstart/touchendのイベントでは、indexが取得できません。
うーん困った。
一応、以下でやれるようにはなったのですが、、、いろいろこわい。
var tableView = Ti.UI.createTableView(); var tableRow1 = Titanium.UI.createTableViewRow(); var tableRow1Label = Titanium.UI.createLabel({text:"label1"}); tableRow1.add(tableRow1Label); var tableRow2 = Titanium.UI.createTableViewRow(); var tableRow2Label = Titanium.UI.createLabel({text:"label2"}); tableRow2.add(tableRow2Label); tableView.appendRow(tableRow1); tableRow1.rowId = 1; tableView.appendRow(tableRow2); tableRow2.rowId = 2; var touched = false; tableView.addEventListener('click', function(e) { touched = false; }); tableView.addEventListener('touchstart', function(e){ touched = true; setTimeout(function(){ if (touched) alert(e.source.getParrent().rowId); },1000); }); tableView.addEventListener('touchmove', function(e){ touched = false; }); tableView.addEventListener('touchend', function(e){ touched = false; });
勝手にTableRowViewにrowIdなんてプロパティを追加しちゃっています。。。
e.sourceで取得出来るのは、実際にはTableRowView上のLabelになります。
そのため、getParrent() でTableRowViewを取得します。
長押しはAndroidの基本的な機能で、かつテーブル内の要素を長押し、ってのもよくあるので、ぜひTitanium側で巻き取って欲しいですね。。。