Android に ListView があり、行ビューと親 ListView 自体に onTouchListeners が必要です。行のシングルタップと長押しには個別に応答したいのですが、ListView全体のフリングには応答したいと思います。(行ごとに onFling メソッドを個別に設定できますが、ユーザーが行間で指を動かすことができるため、堅牢ではありません。)行と ListView の onTouchListener を別々に設定することはできますが、両方を設定すると、ListView リスナーはトリガーされず、行リスナーのみがトリガーされます。これは、行リスナーのメソッドで true または false を返す場合に当てはまります。ビューとその親の両方で onTouchListeners をトリガーする方法を知っている人はいますか?
ListView に関連するコード:
アクティビティ onCreate メソッド内:
mListViewDetector = new GestureDetector(new ListViewGestureListener());
mListViewListener = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
return mListViewDetector.onTouchEvent(event);
}
};
mListView = getListView();
mListView.setOnTouchListener(mListViewListener);
カスタム GestureListener クラス (アクティビティでネストされたクラスとして定義):
class ListViewGestureListener extends SimpleOnGestureListener {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
Log.i("ListViewGestureDetector","onFling");
return false;
}
}
リストビューの個々の行に関連するコード:
アダプタ クラスの bindView メソッドでは、次のようになります。
TextView textView;
textView.setOnTouchListener(new ListsTextViewOnTouchListener());
カスタム onTouchListener クラス (アダプター クラスでネストされたクラスとして定義):
class ItemsTextViewOnTouchListener implements OnTouchListener {
public boolean onTouch (View v, MotionEvent event){
switch(event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
//stuff
return false;
case MotionEvent.ACTION_CANCEL:
//stuff
return false;
default:
break;
}
return false;
}
}