我在 GridView 中有 ImageViews,我一直在使用 OnItemClickListener 以及在 GridView 上设置的 OnItemLongClickListener 来在更大的页面上打开图像并分别删除该项目。现在,我必须在 GridView 中实现 ImageViews 的重新排列,所以我打算将删除功能移动到双击手势,(请不要教我关于 android 样式指南(包括我建议的上下文操作栏的可能性) ,因为这是我的老板要求在我们的 ios 应用程序中模拟功能),以便为拖放保留长按。我在自定义适配器的 getView 中的每个视图上设置了一个 OnTouchListener,为 GestureDetecter 提供一个侦听器,该侦听器使用 onTouchEvent 扩展 SimpleOnGestureListener 给定的 MotionEvent。到那时我知道该怎么做,但是当我包括(当然是 onDown 以获取其他回调)onDoubleTap、onSingleTapConfirmed 和 onLongPressed 时,所有点击都被解释为长点击。当我删除两个回调方法以再次替换为它们的侦听器对应物(即 OnItemClickListeners)时,我收到了这两个手势,但没有收到双击,这是有道理的,因为双击开始是单击,除非您等待不到一秒钟就确认他们是单打而不是潜在的双打。我还尝试将 OnItemClickListener,但不是 OnItemLongClickListener,与扩展 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;
}
});
}
}
而在 Activity 中,gv 是我的 GridView:
gv.setOnItemLongClickListener(gridAdapter);
另请注意,在尝试当前配置之前,我一直在 GestureDetector 方法的返回值中使用 true。看不出有什么区别。感谢您宝贵的时间和帮助,我希望有人能够指出我做错了什么。
-杰克逊