方法一:
用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; } });