地址

CSDN 地址:http://blog.csdn.net/xiangyong_1521/article/details/50957563

scroollview、listview、gridview是我们常用的滚动类型布局,应工作中的一个需求,需要监听这些布局的页面停留状态,以配合更新页面UI,然后通过按钮点击以控制这些页面的滚动;

目录

  • scroollview监听方法
  • listview监听方法
  • gridview监听方法
  • 通过smoothScrollBy()方法对页面进行控制

一、scroollview监听方法

private class ScrollListener implements OnScrollListener{@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {}@Override
public void onScroll(AbsListView view, //报告滚动状态的视图
int firstVisibleItem,//第一个可见item的索引
int visibleItemCount,//可见item的数量
int totalItemCount)//项目列表中的适配器的数量
{
if (firstVisibleItem==0) {
View view2 = gridView.getChildAt(firstVisibleItem);
if (view2!=null) {
Log.i("TAG","view2.getY()"+view2.getY()); //可获取到任何状态下的第一个可见item索引的getY()值
if (view2.getY() == 8) {//在顶部 更新UI
button_up.setBackgroundResource(R.drawable.upb);//向上的键为灰色
button_up.setClickable(false);//且不能按
} else {
button_up.setBackgroundResource(R.drawable.upg);//向上的键为白色
button_up.setClickable(true);//能按
}
}
}else{
button_up.setBackgroundResource(R.drawable.upg);//向上的键为白色
button_up.setClickable(true);//能按
}if ((firstVisibleItem+visibleItemCount)==totalItemCount) {
View view3 = gridView.getChildAt(totalItemCount-1-firstVisibleItem);//scrollview所占的高度
if (view3!=null) {
Log.i("TAG","view3.getY()"+view3.getY());
if (view3.getY() == 246) {//在底部 更新UI
button_down.setBackgroundResource(R.drawable.downb); //向下的键为灰色
button_down.setClickable(false); //且不能按
} else {
button_down.setBackgroundResource(R.drawable.downg); //向下的键为白色
button_down.setClickable(true); //能按
}
}
}else{//在中部 更新UI
button_down.setBackgroundResource(R.drawable.downg); //向下的键为白色
button_down.setClickable(true); //能按
}
}
}

此方法调用OnScrollListener接口来实现Scroll页面的监听,在方法onScroll内,我们可以拿到几个重要的数值,在实际的使用中,可能打印这些数据,以配合功能的实现!


二、listview监听方法

ListView().setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}@Override
public void onScroll(AbsListView view,
int firstVisibleItem, //第一个可见item的索引
int visibleItemCount, //可见item的数量
int totalItemCount) //项目列表中的适配器的数量
{
if(firstVisibleItem==0){
Log.e("log", "滑到顶部");
}
if(visibleItemCount+firstVisibleItem==totalItemCount){
Log.e("log", "滑到底部");
}
}
});

listview的监听方法更简单明了,也是调用的setOnScrollListener监听,在onScroll方法内直接计算几个数值即可实现监听。


三、gridview监听方法

@Override
public void onScrollChanged(ObservableScrollView observableScrollView,
int x, int y, int oldx, int oldy) {
int scrollY=observableScrollView.getScrollY();//顶端以及滑出去的距离
int height=observableScrollView.getHeight();//界面的高度
int scrollViewMeasuredHeight=observableScrollView.getChildAt(0).getMeasuredHeight();//scrollview所占的高度
if(scrollY==0){//在顶端的时候
button_up.setBackgroundResource(R.drawable.upb);//向上的键为灰色
button_up.setClickable(false);//且不能按
}else if((scrollY+height)==scrollViewMeasuredHeight){//当在底部的时候
button_down.setBackgroundResource(R.drawable.downb); //向下的键为灰色
button_down.setClickable(false); //且不能按
}else {//当在中间的时候
button_down.setBackgroundResource(R.drawable.button_down);//向下为白色
button_down.setClickable(true); //可点击
button_up.setClickable(true);//可点击
button_up.setBackgroundResource(R.drawable.button_up); //向上的键为白色
}
}

四、通过smoothScrollBy()方法对页面进行控制

button_down.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(true){
if(type==1){
includeView2.smoothScrollBy(1000, 470);
}else{
gridView.smoothScrollBy(300, 1000);
}else{
listView.smoothScrollBy(300, 1000);
}
}
}
});
button_up.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(true){
if(type==1){
includeView2.smoothScrollBy(1000, -470);}else{
gridView.smoothScrollBy(-300, 1000);
}else{
listView.smoothScrollBy(-300, 1000);
}
}
}
});

通过smoothScrollBy,我们可以控制页面的滚动,我们看下在HorizontalScrollView类中的smoothScrollBy,smoothScrollTo的源码:

/**
* Like {@link View#scrollBy}, but scroll smoothly instead of immediately.
*
* @param dx the number of pixels to scroll by on the X axis
* @param dy the number of pixels to scroll by on the Y axis
*/
public final void smoothScrollBy(int dx, int dy) {
if (getChildCount() == 0) {
// Nothing to do.
return;
}
long duration = AnimationUtils.currentAnimationTimeMillis() - mLastScroll;
if (duration > ANIMATED_SCROLL_GAP) {
final int width = getWidth() - mPaddingRight - mPaddingLeft;
final int right = getChildAt(0).getWidth();
final int maxX = Math.max(0, right - width);
final int scrollX = mScrollX;
dx = Math.max(0, Math.min(scrollX + dx, maxX)) - scrollX;mScroller.startScroll(scrollX, mScrollY, dx, 0);
postInvalidateOnAnimation();
} else {
if (!mScroller.isFinished()) {
mScroller.abortAnimation();
}
scrollBy(dx, dy); //调用View的scrollBy(x.y)方法
}
mLastScroll = AnimationUtils.currentAnimationTimeMillis();
}/**
* Like {@link #scrollTo}, but scroll smoothly instead of immediately.
*
* @param x the position where to scroll on the X axis
* @param y the position where to scroll on the Y axis
*/
public final void smoothScrollTo(int x, int y) {
smoothScrollBy(x - mScrollX, y - mScrollY);
}

smoothScrollBy(x,y)方法在判断滑动间隔的时间长短后判定是一蹴而就还是慢慢滑向终点,关键方法是调用View的srcoll(x,y)方法,或借助scroller,这里x,y也是相对改变的值。


这样,关于scroollview、listview、gridview是我们常用的滚动和smoothScrollBy的方法就讲完了,如果你有更好的方法或者有疑问的地方,随时欢迎交流!

转载于:https://www.cnblogs.com/xiangevan/p/10751720.html

笔记5 | 监听scroollview、listview、gridview页面滑动,判断是否滑动到顶部以及底部...相关推荐

  1. Unity学习笔记:监听函数有什么卵用?(似乎就是从一件事过渡到另一件事?)

    Unity学习笔记:监听函数有什么卵用?(似乎就是从一件事过渡到另一件事?) 个人学习经验,仅供参考,欢迎各位码友批评指正. 做项目敲代码时,一直不是很理解监听函数是个什么玩意. 按我目前的理解,说白 ...

  2. 【js监听报错】页面监听js报错问题

    <html> <head> <script type="text/javascript">// 页面监听js报错问题 οnerrοr=handl ...

  3. 二、Vue基础语法学习笔记——事件监听v-on、条件判断(v-if、v-else-if、v-else、v-show)、循环遍历(v-for遍历数组对象,key属性、检测数组更新)、图书案例、双向绑定

    四.事件监听 在前端开发中,我们需要经常和用于交互. 这个时候,我们就必须监听用户发生的时间,比如点击.拖拽.键盘事件等等 在Vue中如何监听事件呢?使用v-on指令 v-on介绍 作用:绑定事件监听 ...

  4. 监听浏览器刷新/关闭页面

    首先,使用onunload或onbeforeunload可以监听浏览器关闭事件,但是无法区分关闭与刷新.以下js代码可以部分监听关闭浏览器的事件! 可以在标签中添加方法: <!DOCTYPE h ...

  5. waypoint+animate元素滚动监听触发插件实现页面动画效果

    最近在做一个官网类型滚动加载动画,使用到waypoint监听事件插件和animate动画样式,两者结合完美实现向下滚动加载动画,但是没有做向上滚动撤消动画,留待以后有空研究 首先来介绍下jquery. ...

  6. Android X5WebView网络监听替换WebView失败页面稳定

    一.我这边是集成了腾讯所提供的X5Webview插件,没有别的原因,就感觉比原生处理的稍微好点吧. x5Webview与H5的交互问题 x5同步cookie问题 WebView加载进度条问题处理 H5 ...

  7. 开发笔记- iOS监听某些事件的方法简单梳理

    ----Make by -LJW 转载请注明出处--- 通知(NSNotificationCenter\NSNotification) 任何对象之间都可以传递消息 使用范围(多对多) 1个对象可以发通 ...

  8. 监听列表ListVIew的滑动状态

    /*监听列表的滑动状态:暂时用不到* SCROLL_STATE_FLING 时让图片不显示,提高滚动性能让滚动小姑更平滑* SCROLL_STATE_IDLE 时显示当前屏幕可见的图片*/mListV ...

  9. js监听用户关闭当前页面

    只需要监听一个函数 当然 前提是 你的dom树要挂载好了 如果你是vue项目 放在mounted里就好了 window.onbeforeunload = function(e) {debugger }

最新文章

  1. 2招按摩轻松解除黑眼圈 - 生活至上,美容至尚!
  2. Web最基本的弹出窗口代码(javascript)
  3. 【LeetCode笔记】124. 二叉树中的最大路径和(Java、二叉树、DFS)
  4. AAAI 2021 | 商汤提出BSN++: 时序动作提名生成网络
  5. sqlserver2008索引优化的相关研究(一)
  6. 初始化与赋值哪个效率高?
  7. 极具破坏力的Linux系统命令
  8. PR软件怎么去视频噪声
  9. 飞利浦DR与PACS进行worklist多部位登记方法分享
  10. 安装LuaRocks
  11. 模板匹配人眼---OpenCV-Python开发指南(33)
  12. matlab 决策树 多叉树,决策树简介
  13. 第十篇:SpringBoot集成支付宝接口扫码支付
  14. “Only fullscreen opaque activities can request orientation “问题分析
  15. HTML+CSS期末大作业:动漫网站设计——悬崖上的金鱼姬(5页) / 动漫网页设计作业,网页设计作业 / 动漫网页设计成品 学生DW网页设计作业成品 web课程设计网页规划与设计...
  16. ssh怎么ftp上传文件到服务器,ssh ftp上传文件到服务器
  17. 5分绩点转4分_5分绩点转4分_gpa5分制换算4分制(5分绩点转4分)
  18. macbook进水不用怕
  19. 西工大c语言noj作业答案,西工大noj答案
  20. 《Unity Shader 入门精要》读书笔记

热门文章

  1. VUE页面实现加载外部HTML方法
  2. spring-cloud熔断和负载均衡
  3. Android开发笔记(二十)顶部导航栏ActionBar
  4. Asp.Net Core基于JWT认证的数据接口网关Demo
  5. 「镁客早报」传SpaceX计划展开7.5亿美元贷款融资;LG开始为苹果生产OLED面板
  6. 阿里云产品专家解读链路追踪(Tracing Analysis)
  7. git快速入门 push/clone/reset/merge/切换分支全都有
  8. 全新的PDO数据库操作类(仅适用Mysql)
  9. MyEclipse 2014下搭建Android开发环境
  10. 朝鲜欲对韩国发起大规模网络攻击 但计划被韩方挫败