Listview在viewflipper中滑动

时间:2010-05-28 06:45:22

标签: android listview

我试图在列表视图上左右滑动,并将viewflipper设为swtich。就像remeberthemilk应用程序和nexus上的默认新闻和天气应用程序一样(刷新新闻主题)。使用我发现的各种教程,我遇到了一个显示如何实现滑动手势的stackoverflow

    class MyGestureDetector extends SimpleOnGestureListener {
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        try {
            if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
                return true;
            // right to left swipe
            if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {


            }  else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                viewFlipper.setInAnimation(slideRightIn);
                viewFlipper.setOutAnimation(slideRightOut);
                viewFlipper.showPrevious();
            }
        } catch (Exception e) {
            // nothing
        }
        return true;
    }
}

我做了这个工作

  lstView.setOnTouchListener(gestureListener);

然而,有时会发生的事情是当人员滑动时会触发listview setOnItemClickListener。我如何防止这种情况发生,并且只有当用户实际点击它列表项而不只是在其上滑动时才会触发setOnItemClickListener。

谢谢, 费萨尔阿比德

3 个答案:

答案 0 :(得分:2)

我找到的一种方法是onItemClick而不是依赖onItem实现

@Override
 public boolean onSingleTapConfirmed(MotionEvent e) {

     // TODO Auto-generated method stub
     Log.e("Item Click", "Item Click");
     return super.onSingleTapConfirmed(e);

 }

在SimpleOnGestureListener中,似乎它可以正常工作

答案 1 :(得分:1)

这是我使用的方式。这很简单。

将onTouchListener分配给ViewFlipper时,首先为该侦听器创建引用。

public class ViewFlipperTouchListener implements OnTouchListener {
   ....
   ......
}


ViewFlipperTouchListener listener = new ViewFlipperTouchListener ();

mViewFlipper.setOnTouchListener(listener);



//now you have reference to listener. use it to send on touch event.


mListView.setOnTouchListener(new OnTouchListener(){

  @Override
  public boolean onTouch(View v, MotionEvent event){
     listener.onTouch(v, event);
 return false;
  }
});

我只是通过使用引用“listener”将MotionEvent委托给viewflipper的onTouchListener。并返回false以暗示ListView上没有使用该事件。这将帮助您向下/向上列表视图并委派所有内容(向下/向上滚动并向左/向右滑动等等到听众。)..

相信它。它很好用:D

答案 2 :(得分:0)

我认为除了在你的代码中使用你的常量之外,你不能做很多事情,所以如果用户点击或想要刷卡,它可以更好地判断。例如,我在我的代码中使用以下方式(我使用触摸事件,但原则应该类似):

@Override
public boolean onTouch(View view, MotionEvent event) {

    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        {
            downXValue = event.getX();
            downTime = event.getEventTime();
            break;
        }

    case MotionEvent.ACTION_UP:
        {
            float currentX = event.getX();
            long currentTime = event.getEventTime();
            float difference = Math.abs(downXValue - currentX);
            long time = currentTime - downTime;

            Log.i("Touch Event:", "Distance: " + difference + "px Time: " + time + "ms");

            if ((downXValue < currentX) && (time > 50) && (difference > 50)) {
                showPrevious();
            }

            if ((downXValue > currentX) && (time > 50) && (difference > 50)) {
                showNext();
            }
            break;
        }
    }
}

如你所见,我在那里放了一个Log输出。所以我只测试了应用程序,每次我试图翻转或点击时,Log告诉我我按了多长时间,差异有多大。所以我在if条件中调整了我的值,直到它在几乎所有情况下都有效