3

私は GridView 内に ImageViews を持っています。私は GridView に設定された OnItemLongClickListener と共に OnItemClickListener を使用して、より大きなページで画像を開き、それぞれアイテムを削除していました。ここで、GridView で ImageView の再配置を実装する必要があるため、削除機能をダブルタップ ジェスチャに移動する予定です (Android スタイルのガイドラインについて説明しないでください (私が提案したコンテキスト アクションバーの可能性を含む))。 、これは上司がiOSアプリ内の機能をエミュレートするために要求するものであるため)ドラッグアンドドロップ用に長いクリックを予約します。カスタム アダプターの getView の各ビューに OnTouchListener を設定し、GestureDetecter に、指定された MotionEvent を onTouchEvent で SimpleOnGestureListener を拡張するリスナーを供給します。それまでにやるべきことはわかっているのですが、しかし、(もちろん、他のコールバックを取得するために onDown) onDoubleTap、onSingleTapConfirmed、および onLongPressed を含めると、すべてのタップが長いクリックとして解釈されました。そして、両方のコールバック メソッドを削除して、対応するリスナー (つまり OnItemClickListeners) にもう一度置き換えると、これら 2 つのジェスチャは受信しましたが、ダブル タップは受信しませんでした。潜在的なダブルスではなくシングルスとして確認するのに 1 秒もかかりません。また、OnItemLongClickListener ではなく OnItemClickListener を、拡張された SimpleOnGestureListener のコールバックに配置しようとしました。この場合、長押しのみが解釈されましたが、他のジェスチャには応答がありませんでした。これが現在の私のコードです。

public class MainBoardGridAdapter extends GenericBoardGridAdapter implements OnItemLongClickListener {
    private class Ges extends GestureDetector.SimpleOnGestureListener {
        int pos;
        public Ges(View v) {
            pos = (Integer) v.getTag();
        }
        @Override
        public boolean onDown(MotionEvent me) {
            //this does get called but none of these methods below
            return true;
        }
        @Override
        public boolean onDoubleTap(MotionEvent me) {
            new DeleteConfirmationPrompt(c, "board") {
                @Override
                protected boolean onDeleteConfirmed() {
                    // delete the visionboard
                    return deleteBoard(pos);
                }
            }; // Constructor shows dialog
            return false;
        }
        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            MainBoardGridAdapter.super.flagForUpdate(pos);
            if (listener != null) {
                listener.onBoardClick(pos, getName(pos));
            } else {
                Intent intent = new Intent(c, VisionBoardActivity.class);
                intent.putExtra(VisionBoardActivity.EXTRA_VISION_BOARD_NAME, getName(pos));
                frag.startActivityForResult(intent, MyBoardsFragment.REQUEST_EDIT);
            }
            return false;
        }
    }


    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View v,
        final int pos, long id) {
         Toast.makeText(c, "Long", Toast.LENGTH_LONG).show();
         return false;
    }
    // called by getView of extended adapter
    @Override
    public void onImageLoaded(ImageView iv, String data, View root) {
         iv.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
               (new GestureDetector(c, (new Ges(v)))).onTouchEvent(event);
                return false;
            }
         });
    }
}

アクティビティでは、gv は私の GridView です。

gv.setOnItemLongClickListener(gridAdapter);

また、現在の構成を試すまで、GestureDetector メソッドの戻り値に true を使用していたことにも注意してください。違いは見られませんでした。貴重なお時間とご協力に感謝します。誰かが私が間違っていることを指摘できることを願っています。

-ジャクソン

4

0 に答える 0