在我的应用程序中,我的ListView有一个Touchlistener。使用TouchListener,我可以从触摸事件中获取X和Y坐标。现在我想从ListView获取被点击的项目。如何使用onTouchListener获取listView中单击项的位置?我不想使用onItemClickedListener。
答案 0 :(得分: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;
}
获得的
答案 1 :(得分:4)
答案 2 :(得分:3)
如果您使用TouchListener
不是强制性的,我强烈建议您使用OnItemClickListener
。它会大大简化你的生活。
除此之外,你必须得到ListView
的当前偏移量和滚动位置,每行的高度,然后做一些数学运算来确定点(x,y)是否位于在每行的多边形中。由于行是矩形,数学并不太难,但使用OnItemClickListener
会更容易。
此外,如果 需要使用TouchListener
,您还可以使用OnItemClickListener
在Adapter
班级(或其他地方)设置值指示单击的最新项目。然后,在TouchListener
中,您可以检查该值并使用它来关联(x,y)坐标和ListView
项。当然,这取决于首先运行的OnItemClickListener
。如果反之亦然,您可以使其工作,但使用TouchListener
存储触摸位置,然后将其与OnItemClickListener
相关联。
答案 3 :(得分: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.
}