手势听众onFling不代理一致

The*_*ter 11 android listview gestures

更新:请参阅赏金以了解扩展问题.

我有一个GestureDetector设置ListView.ListView是一个完整的片段,它来自窗口的一侧并部分覆盖另一个片段.我想让用户能够将其轻扫(即Wunderlist是右侧此功能的一个很好的例子).

这是我的设置:

    gestureListener = new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {

            if (gestureDetector.onTouchEvent(event)) {
                return true;
            }

            return false;
        }
    };
    listView.setOnTouchListener(gestureListener); 
Run Code Online (Sandbox Code Playgroud)

听众本身:

public class GestureListener extends SimpleOnGestureListener {

        private static final int SWIPE_MIN_DISTANCE = 180;
        private static final int SWIPE_THRESHOLD_VELOCITY = 50;

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                float velocityY) {

            try {
                if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE
                        && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {

                    FragmentManager fma = getActivity()
                            .getSupportFragmentManager();



                    FragmentManager fm = getFragmentManager();
                    FragmentTransaction t = fm.beginTransaction();

                    SherlockListFragment mFrag = new RateReviewFragment();

                    t.add(R.id.main_frag, mFrag);
                    t.setCustomAnimations(R.anim.animation_enter,
                            R.anim.animation_leave);
                    t.remove(mFrag);
                    t.commit();

                }
                return false;
            } catch (Exception e) {

            }
            return false;
        }





        @Override
        public void onLongPress(MotionEvent e) {

            // edited out; this opens up a context menu
        }

    }
Run Code Online (Sandbox Code Playgroud)

有时,当ListView滚动到底部(或列表滚动被列表行点击中断)时,GestureListener只是停止...听.刷卡不起作用.您必须滚动到顶部才能让它再次运行.

如果有人能帮我隔离这些问题,我将不胜感激!

更新:只有一个问题,"听众停止听"

更新二:我可能已经弄明白这是什么原因; 只是不知道修复:

在记录我的行为后我发现了一些东西; 我在列表中得到的越低(我与它交互的越多),测量结果就不一致了.例如,如果我将手指向左和向右移动一厘米 - 在列表的最顶部,它会说我移动了,例如,200像素.但是,当我遇到上述问题时,对于相同的 1厘米距离,它可能会低得多,甚至可能为50 .所以窗口没有关闭,因为它不符合我的if条件.

旁注:我已经多次说过,问题在于"与列表进行交互".这意味着:如果我快速从上到下滚动; 没有任何问题; 但是,如果我慢慢地向下工作,也许点击屏幕,滚动打开和关闭,点击按钮listView,其中一些打开一个新的活动(然后回到相同的位置),这是"与"交互".

AjO*_*ire 3

尝试这个,

    gestureDetector = new GestureDetector(getActivity(),
            new GestureListener());
    View.OnTouchListener gestureListener = new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
           listView.onTouchEvent(event);
           gestureDetector.onTouchEvent(event);

            return true;
        }
    };
    listView.setOnTouchListener(gestureListener);
Run Code Online (Sandbox Code Playgroud)

并进行以下更改

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
                float distanceX, float distanceY) {
  return true;
}
Run Code Online (Sandbox Code Playgroud)

编辑: 我看到了应用程序奇妙清单,如果你想模拟该功能,请尝试这种方法,

使用 onInterceptTouch 作为根布局(listView 是其子布局),在此方法中,您必须检查用户是否已滑动,如下所示,

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
  if (ev.getAction() == MotionEvent.ACTION_MOVE) {
    if(/* Check your condition here */) { 
      // User has swiped 
      return true;
    }
  }

  return false; // return false so that the event will be passed to child views.
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息Android onInterceptTouchEvent