在我的应用程序中,我的 ListView 有一个 Touchlistener。使用 TouchListener,我可以从触摸事件中获取 X 和 Y 坐标。现在我想从 ListView 中获取点击的项目。如何仅使用 onTouchListener 获取 listView 中单击项的位置?我不想使用 onItemClickedListener。
问问题
15264 次
4 回答
21
switch (motionEvent.getActionMasked()) {
case MotionEvent.ACTION_DOWN: {
if (mPaused) {
return false;
}
// TODO: ensure this is a finger, and set a flag
// Find the child view that was touched (perform a hit test)
Rect rect = new Rect();
int childCount = mListView.getChildCount();
int[] listViewCoords = new int[2];
mListView.getLocationOnScreen(listViewCoords);
int x = (int) motionEvent.getRawX() - listViewCoords[0];
int y = (int) motionEvent.getRawY() - listViewCoords[1];
View child;
for (int i = 0; i < childCount; i++) {
child = mListView.getChildAt(i);
child.getHitRect(rect);
if (rect.contains(x, y)) {
mDownView = child; // This is your down view
break;
}
}
if (mDownView != null) {
mDownX = motionEvent.getRawX();
mDownPosition = mListView.getPositionForView(mDownView);
mVelocityTracker = VelocityTracker.obtain();
mVelocityTracker.addMovement(motionEvent);
}
view.onTouchEvent(motionEvent);
return true;
}
于 2013-06-29T20:24:55.737 回答
4
使用此方法的最佳方法pointToPosition(int x, int y)和pointToRowId(int x, int y)
于 2014-10-16T13:16:50.963 回答
2
如果您不强制使用 a TouchListener
,我强烈建议您使用OnItemClickListener
. 它将大大简化您的生活。
除此之外,您必须获取 的当前偏移量和滚动位置、ListView
每行的高度,然后进行一些数学运算以确定点 (x,y) 是否位于每行的多边形中。由于行是矩形,数学不是太难,但使用OnItemClickListener
起来会容易得多。
此外,如果您确实需要使用TouchListener
,您还可以使用OnItemClickListener
在您的类(或其他地方)上设置一个值,Adapter
指示最近点击的项目。然后,TouchListener
您可以检查该值并使用它来关联 (x,y) 坐标和ListView
项目。当然,这取决于OnItemClickListener
首先运行。如果反之为真,则可以使其工作,而是将触摸位置存储在使用 中TouchListener
,然后将其关联到OnItemClickListener
.
于 2013-06-29T19:59:29.540 回答
1
你的班级可以同时实现View.OnTouchListener, AdapterView.OnItemClickListener
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if(motionEvent.getAction() == MotionEvent.ACTION_UP){
Log.d(TAG, "ontouch: UP");
**// Here you can figure if it was simple item click event.
// We return false only when user touched once on the view.
// this will be handled by onItemClick listener.**
if(lastAction == -1){
lastAction = MotionEvent.ACTION_UP;
view.clearFocus();
return true;
}
return false;
}
else if(motionEvent.getAction() == MotionEvent.ACTION_DOWN){
Log.d(TAG, "ontouch: DOWN");
return false;
}
else {
// This is all action events.
lastAction = -1;
return true;
}
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// We come here after onTouch event figured out that its a simple touch event and needs to be handled here.
}
于 2017-06-21T07:11:39.180 回答