【发布时间】:2011-12-13 13:18:57
【问题描述】:
场景: 有一个列表视图。用户可以滑动或点击它进行交互。点击时,它会打开一个新的活动,显示列表视图中项目的详细信息。在滑动时,它会切换项目的状态,例如从“已读”到“未读”,反之亦然。
使用 GestureListener 捕获手势
class MyGestureDetector extends SimpleOnGestureListener{
// Detect a single-click and call my own handler.
@Override
public boolean onSingleTapUp(MotionEvent e) {
ListView lv = getListView();
int pos = lv.pointToPosition((int)e.getX(), (int)e.getY());
myOnItemClick(pos);
return true;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if (Math.abs(e1.getY() - e2.getY()) > REL_SWIPE_MAX_OFF_PATH)
return false;
ListView lv = getListView();
int pos = lv.pointToPosition((int)e1.getX(), (int)e1.getY());
if(e1.getX() - e2.getX() > REL_SWIPE_MIN_DISTANCE &&
Math.abs(velocityX) > REL_SWIPE_THRESHOLD_VELOCITY) {
onRTLFling(e2, pos);
} else if (e2.getX() - e1.getX() > REL_SWIPE_MIN_DISTANCE &&
Math.abs(velocityX) > REL_SWIPE_THRESHOLD_VELOCITY) {
onLTRFling(e2, pos);
}
return true;
}
}
点击方法:
private void myOnItemClick(int position) {
//String str = MessageFormat.format("Item clicked = {0,number}", position);
//Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
int topChild = lv.getFirstVisiblePosition();
//String text = ((TextView) lv.getChildAt(position + topChild)).getText().toString();
Toast.makeText(this, "Clicked on item: " + (position + topChild) , Toast.LENGTH_SHORT).show();
}
从左到右甩的方法:
private void onLTRFling(MotionEvent motionEvent, int position) {
String text = ((TextView) lv.getChildAt(position)).getText().toString();
Toast.makeText(this, "Left-to-right fling on item: " + position + "|" + text, Toast.LENGTH_SHORT).show();
MotionEvent cancelEvent = MotionEvent.obtain(motionEvent);
cancelEvent.setAction(MotionEvent.ACTION_UP);
lv.onTouchEvent(cancelEvent);
}
从右向左甩的方法
private void onRTLFling(MotionEvent motionEvent, int position) {
String text = ((TextView) lv.getChildAt(position)).getText().toString();
Toast.makeText(this, "Left-to-right fling on item: " + position + "|" + text, Toast.LENGTH_SHORT).show();
MotionEvent cancelEvent = MotionEvent.obtain(motionEvent);
cancelEvent.setAction(MotionEvent.ACTION_UP);
lv.onTouchEvent(cancelEvent);
}
现在,在所有三种方法中,我想访问与行相关的视图(已执行手势)。我尝试使用listView.getChild(position),其中“位置”是我在“MyGestureDetetor”类中计算的“pos”。在滚动列表视图之前它工作正常。我发现每次滚动列表视图时位置都会发生变化。
有没有一种方法可以让我访问底层视图并像使用“onItemClickListener”一样对其进行操作?
【问题讨论】: