方法一:
用setOnScrollListener(new AbsListView.OnScrollListener())来实现,判断滑动后显示的第一个条目 ,与滑动前的第一个条目的大小来判断,
这种方法逻辑简单,但是必须要滑动到当前第一条目隐藏后才能起作用,当listview的单个条目的高度很大时,这种方法就不好使了。代码如下:
lv_shiti_content.setOnScrollListener(new AbsListView.OnScrollListener() { boolean scrollFlag=false;//标记是否滑动 boolean isFirst=true;//标记第一次进入,因为第一次进来lastVisibleItemPosition默认为0, // 此时如果listview的第一个显示的条目不是第一个(下表为0),则往下滑也会出现firstVisibleItem>lastVisibleItemPosition的情况 //所以第一次进入时不做操作,第二次进来已经给lastVisibleItemPosition赋值,就可以判断了 int lastVisibleItemPosition;//标记上次的显示位置 @Override public void onScrollStateChanged(AbsListView view, int scrollState) { if(scrollState==1||scrollState==2){ //其中1 表示滑动,等同于 AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL // 2 表示惯性滑动 等同于 AbsListView.OnScrollListener.SCROLL_STATE_FLING scrollFlag=true; }else{ scrollFlag=false; } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { if(!isFirst){ if(firstVisibleItem>lastVisibleItemPosition){ //执行向上滑动时要做的逻辑 } lastVisibleItemPosition=firstVisibleItem;//记录当前条目 isFirst=false; } } });
方法二:
使用setOnTouchListener(new View.OnTouchListener()方法,这种方法,只要有一点移动距离就可以判断。
特别说明:android控件的事件传递时是默认直接传递到最里层,只有在上下滑动的时候才会中断事件,所以我们获取到的第一个事件是move事件。
而我们的逻辑也是在move事件中做的,这就造成获取的lasty和movey的值是相同的(看下面代码)
所以我们要判断,只有第一次进来的时候获取lasty。以后都是lasty直接记录当前的movey。不然每次的lasty和movey永远是相同的值。
lv_shiti_content.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if(isFirstClick){//只有第一次进来的时候用获取位置的方法给lastY赋值,后面的值都是上一次的move坐标 //如果不做此判断,每次的lasty和movey是相同的值,这是因为在此处获取的的y值其实就是move的值, //是因为在listview中,down事件是默认传递进去给条目的,在此处无法响应down事件。 lastY=event.getY(); isFirstClick=false;//初始值是true,此处置为false。 } switch (event.getAction()){ case MotionEvent.ACTION_MOVE: float moveY = event.getY(); Log.e("moveY_START",moveY+""); if(moveY< lastY){ if(!NewPageisOpen){//初始值为false ,由于move方法会不断调用,为防止多次打开页面。 Intent intent = new Intent(getActivity(), ShitidianTestActivity.class); startActivity(intent); NewPageisOpen = true; } } lastY=moveY; break; } return false; } });