列表视图的水平投掷:滞后问题

时间:2012-09-28 21:01:27

标签: android

我根据这个主题实现了我的手势监听器:ListView Horizontal Fling Gesture

然而,我可以看到列表滚动速度较慢,有时(当你滚动得非常慢时)它也会阻塞。 我认为问题出现在听众身上:计算价值需要时间,因此我正在寻找实际的“从左到右”的搜索...是不是有更有效的方式?

修改

问题出在这里:

@Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) {
            return false;
        }

        // right to left swipe
        if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
            System.out.println("right to left");
            animatedStartActivity(0);

            // right to left swipe
        }  else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
            System.out.println("left to right");
            animatedStartActivity(1);
        }

        return false;
    }

评估此方法需要时间

EDIT2: 我想问题是因为listview已经拥有自己的手势监听器并附加我的覆盖它。这是一个问题,因为listview手势监听器也会考虑速度和加速度,以提供良好的移动效果。我的听众非常原始,所以列表滚动不再平滑.. 即使我的onFLing方法总是返回false(因此它不消耗事件)列表滚动也会受到影响...

EDIT3: 好吧也许我找到了解决方案,但我需要你的帮助! 我可以在容器布局上设置onTouchListener,问题是listview实际上覆盖了父的onTouch,所以我需要反转这种情况:listview上的onTouchEvent必须被父进程拦截,所以返回false就是对listview的影响

1 个答案:

答案 0 :(得分:0)

解决!!! 问题是ListView的onTouchEvent执行了一些其他操作!所以我扩展了ListView:

public class FlingListView extends ListView{

private GestureDetector detector; //this is my detector

public void setDetector(GestureDetector detector){
    this.detector = detector;
}

public FlingListView(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
}

public FlingListView(Context context,AttributeSet set) {
    super(context,set);
    // TODO Auto-generated constructor stub
}

public FlingListView(Context context,AttributeSet set, int a) {
    super(context,set,a);
    // TODO Auto-generated constructor stub
}

     //here I do the magic
@Override
public boolean onTouchEvent(MotionEvent ev) {
    // TODO Auto-generated method stub
    super.onTouchEvent(ev); //I always do the list on touch event
    return(detector.onTouchEvent(ev)); //..but I return the detector!

}
 }

我不知道这是否是最佳解决方案,但仍然......它有效!