判断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;
            }
        });
原文地址:https://www.cnblogs.com/epmouse/p/5409134.html