0

Viewタッチを処理するコンテナがあります。を返すListviewoverridedを持っています(コンテナーがスワイプで展開されると、 が返されます)。タッチが発生するとコンテナに渡され、すべて問題ありません。しかし、アイテムのクリック処理を追加する必要があります。onTouch()falsetrueListviewViewListview

アイテムを設定すると、コンテナに渡されonClickListenerず、スタックされていることがログに表示されます(返されて何もしません)。私はこのようなアイテムを設定しようとしています:MotionEventListView onTouch()falseonTouchListener

    viewHolder.itemLayout.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    return true;

                case MotionEvent.ACTION_MOVE:
                    return false;

                case MotionEvent.ACTION_UP:
                    Log.d(TAG, "something like click detected");
                    return true;
            }
            return false;
        }
    });

しかし、結果は同じです。私のコンテナが touch イベントを受け取らない理由を誰かが説明できますListViewか?falseonTouch()

4

2 に答える 2

1

私は約2週間前に同じ問題を抱えていました。リストビューの onTouch メソッドから false を返すと、イベントが親コンテナーに渡されませんでした。私はこれをやった: 1.コンテナのカスタムレイアウトが必要ですView。次に、そのビューで、たとえば次のように onInterceptTouchEvent をオーバーライドします。

@Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        switch  (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                previousX_actionDOWN = ev.getRawX();
                isOnClick = true;
                timePressed = System.currentTimeMillis();
                return false;
            case MotionEvent.ACTION_MOVE:
                if (isOnClick && (Math.abs(previousX_actionDOWN - ev.getRawX()) > SCROLL_THRESHOLD)) {
                    return true;
                } else {
                    return false;
                }
            case MotionEvent.ACTION_UP:
                if (!wasDragged) {
                    return false;
                }
                else {
                    return true;
                }
        }
        return false;
    }

そのビューには複雑な onTouch メソッドもありますが、貼り付ける価値はありません。ポイントは、ACTION_MOVE中に何らかのしきい値が渡された場合にのみ、親ビューがタッチイベントをインターセプトする必要があるということです-少なくともそれは私が達成したかったことです。次に、リストビューで、onTouch の代わりに標準の onItemClickListener を実装するだけです。

于 2016-03-27T16:12:28.970 に答える
1

ListView アイテムのクリックを処理する場合: OnItemClickListener を使用します。

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            //parent.getItemAtPosition(position) returns the value of item clicked.. use it to do whatever you wish to do
        }
    });
于 2016-03-27T16:07:10.277 に答える