harukazepc’s blog

インターネッツとAndroidなどが大好きです。あとは日々のことなど。

Androidで長押し(LongPress)をTableViewで検知しつつ、該当のRowのindexを得る方法

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;
});

http://developer.appcelerator.com/question/55091/long-press-on-android-or-simulating-it-with-touchstartend

ですが、上記の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側で巻き取って欲しいですね。。。

© harukazepc️