zoukankan      html  css  js  c++  java
  • 判断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;
                }
            });
  • 相关阅读:
    [Algorithms] Counting Sort
    [LeetCode] Sort Colors
    [LeetCode] Contains Duplicate III
    [LeetCode] Contains Duplicate
    [LeetCode] Two Sum II
    [LeetCode] Linked List Cycle II
    [LeetCode] Linked List Cycle
    [LeetCode] Longest Palindromic Substring
    [LeetCode] Two Sum
    [LeetCode] Rectangle Area
  • 原文地址:https://www.cnblogs.com/epmouse/p/5409134.html
Copyright © 2011-2022 走看看