私は 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 を使用していたことにも注意してください。違いは見られませんでした。貴重なお時間とご協力に感謝します。誰かが私が間違っていることを指摘できることを願っています。
-ジャクソン