Android 项目内的触摸监听器点击监听器
Android on touch listener inside an item click listener
我有一个包含项目的列表视图,每次单击列表项目时,我都需要知道我是触摸了屏幕的左侧还是右侧。为了做到这一点,我编写了以下代码:
testListView.setOnItemClickListener(((parent, view, position, id) -> {
view.setOnTouchListener(new View.OnTouchListener() {
private long startClickTime = 0;
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
startClickTime = System.currentTimeMillis();
} else if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
if (System.currentTimeMillis() - startClickTime < ViewConfiguration.getTapTimeout()) {
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
float dpWidth = displayMetrics.widthPixels / displayMetrics.density;
float leftPersentage = (dpWidth) * 100 / 100;
int x = (int) motionEvent.getX();
if (x < leftPersentage) {
Toast.makeText(context,"I have touched the left side of screen",Toast.LENGTH_SHORT);
} else {
Toast.makeText(context,"I have touched the right side of screen",Toast.LENGTH_SHORT);
}
}
}
return true;
}
});
}));
这有效,但是,为了使 Toast 出现,我需要按两次列表元素,我认为这是因为我第一次单击列表项元素时,它注册了 OnTouchListener 和然后,如果我再次点击它就会启动。
如何解决这种奇怪的行为,以便只需单击一下即可触发触摸侦听器?
您需要在 ListView 适配器的 getView 函数上设置 setOnTouchListener,而不是在 setOnItemClickListener 上。
我有一个包含项目的列表视图,每次单击列表项目时,我都需要知道我是触摸了屏幕的左侧还是右侧。为了做到这一点,我编写了以下代码:
testListView.setOnItemClickListener(((parent, view, position, id) -> {
view.setOnTouchListener(new View.OnTouchListener() {
private long startClickTime = 0;
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
startClickTime = System.currentTimeMillis();
} else if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
if (System.currentTimeMillis() - startClickTime < ViewConfiguration.getTapTimeout()) {
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
float dpWidth = displayMetrics.widthPixels / displayMetrics.density;
float leftPersentage = (dpWidth) * 100 / 100;
int x = (int) motionEvent.getX();
if (x < leftPersentage) {
Toast.makeText(context,"I have touched the left side of screen",Toast.LENGTH_SHORT);
} else {
Toast.makeText(context,"I have touched the right side of screen",Toast.LENGTH_SHORT);
}
}
}
return true;
}
});
}));
这有效,但是,为了使 Toast 出现,我需要按两次列表元素,我认为这是因为我第一次单击列表项元素时,它注册了 OnTouchListener 和然后,如果我再次点击它就会启动。
如何解决这种奇怪的行为,以便只需单击一下即可触发触摸侦听器?
您需要在 ListView 适配器的 getView 函数上设置 setOnTouchListener,而不是在 setOnItemClickListener 上。