2

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

}
4

1 に答える 1

1

Pvans、

答えは少しトリッキーですが、その機能が組み込まれていますonTouchEvent()。リスナーであるオブジェクトのTouchEventを処理します。次に、あなたが望むことを達成するための2つのオプションがあります。

1)親ビューをオーバーライドonInterceptTouchEvent()して、そこでフリングを処理できます。これは、子ビューが小さい大きなビューに最適です。私はリストにはこの方法を好みません(率直に言って)。onInterceptTouchEvent()タッチを子供から遠ざけるのは素晴らしいですが、これを行う場合は、左右のフリンジと水平方向のスクロールの両方を処理する必要があります。

GestureDetector2)実際には見えないオーバーレイ(一種)であるを作成することもできます。onTouchEventsを転送しても、目的の動作が得られ、手動でスクロールを処理することを心配する必要はありません。この場合、TouchEventをDetectorに送信するだけで、trueが返された場合、リストは何もせず、OnFlingが機能します。falseが返された場合は処理されなかったため、リストまたはその子の1つに属している必要があります。

これがお役に立てば幸いです、FuzzicalLogic

于 2012-01-06T08:17:45.260 に答える