判斷listview是上滑還是下滑的方法


方法一:

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;
            }
        });

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM