博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
判断listview是上滑还是下滑的方法
阅读量:4308 次
发布时间:2019-06-06

本文共 2981 字,大约阅读时间需要 9 分钟。

方法一:

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

你可能感兴趣的文章
Linux(SUSE 12)安装jboss4并实现远程访问
查看>>
Neutron在给虚拟机分配网络时,底层是如何实现的?
查看>>
netfilter/iptables全攻略
查看>>
Overlay之VXLAN架构
查看>>
Eclipse : An error occurred while filtering resources(Maven错误提示)
查看>>
在eclipse上用tomcat部署项目404解决方案
查看>>
web.xml 配置中classpath: 与classpath*:的区别
查看>>
suse如何修改ssh端口为2222?
查看>>
详细理解“>/dev/null 2>&1”
查看>>
suse如何创建定时任务?
查看>>
suse搭建ftp服务器方法
查看>>
centos虚拟机设置共享文件夹并通过我的电脑访问[增加smbd端口修改]
查看>>
文件拷贝(IFileOperation::CopyItem)
查看>>
MapReduce的 Speculative Execution机制
查看>>
大数据学习之路------借助HDP SANDBOX开始学习
查看>>
Hadoop基础学习:基于Hortonworks HDP
查看>>
为什么linux安装程序 都要放到/usr/local目录下
查看>>
Hive安装前扫盲之Derby和Metastore
查看>>
永久修改PATH环境变量的几种办法
查看>>
大数据学习之HDP SANDBOX开始学习
查看>>