ListView刷新原理及实现

ListView优化方式

  • 界面缓存:ViewHolder+convertView
  • 分页加载:上拉刷新
  • 图片缓存
  • 快速滑动ListView禁止刷新

效果

上拉加载更多原理及实现

当我们手指滑动到listview最后位置的时候,我们触发加载数据的方法。这触发之前我们需要做一些工作,包括:如何判断滑动到最后?如何避免重复加载数据?加载之后如何刷新界面?

  • 界面实现AbsListView.OnScrollListener接口,当firstVisibleItem + visibleItemCount >= totalItemCount即可判断滑动到了最下面;
  • 为了不重复加载数据,例如当我手指滑动到最下面,手指立马离开,然后再马上滑动,就会导致数据拉取两次,我们利用mHandler.hasMessages(LOAD)判断消息队列中是否已经存在这个消息;
  • 我们在handler中加载新数据,并且利用 mStringArrayAdapter.notifyDataSetChanged();通知界面刷新。

        int result1;int result2;//监听状态改变@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {switch (scrollState) {case SCROLL_STATE_IDLE://滑动结束if (result1 >= result2) {//只发送一次,防止多次加载数据if (!mHandler.hasMessages(LOAD))mHandler.sendEmptyMessageDelayed(LOAD, 5000);}break;case SCROLL_STATE_FLING://手指离开屏幕break;case SCROLL_STATE_TOUCH_SCROLL://滑动中break;}}//滑动结束之后执行@Overridepublic void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {// Log.e(TAG, "firstVisibleItem:" + firstVisibleItem + "---visibleItemCount:" + visibleItemCount + "--totalItemCount:" + totalItemCount);//加载到最后if (firstVisibleItem + visibleItemCount >= totalItemCount) {//这里不处理,在上面状态改变结束之后再处理}result1=firstVisibleItem + visibleItemCount;result2=totalItemCount;}
    

下拉加刷新原理及实现

下拉刷新核心原理和上拉加载核心原理一致,只是有细节不同。我们需要处理以下问题:如何判断用户当前位置在数据第一条?如何判断用户在第一条的同时下拉一定距离?如何刷新更新界面(上面已经解决)?

注意事项:

初始化应该设置默认上面的刷新图标隐藏,在ProgressBar中设置android:visibility="gone";这样设置还不行,还需要设置 mListView.setSelection(1);让当前第一列是第一条数据。同样的,在加载完成之后也要设置mListView.setSelection(1);,显示第一行。

实现

  • 判断第一条的方式mListView.getFirstVisiblePosition()==0
  • mListView实现 mListView.setOnTouchListener方法,来根据用户手指按下的位置以及抬起的位置,计算这两者的距离与我们规定的距离(如100)的大小,如大于就进行刷新操作。
  • 刷新之后通知界面mStringArrayAdapter.notifyDataSetChanged();

     mListView.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:startY=event.getY();break;case MotionEvent.ACTION_MOVE:break;case MotionEvent.ACTION_UP:endY=event.getY();if(endY-startY> DISTANT&&(mListView.getFirstVisiblePosition()==1||mListView.getFirstVisiblePosition()==0)){if(!mHandler.hasMessages(FRESH)){mProgressBar_top.setVisibility(View.VISIBLE);//notifmHandler.sendEmptyMessageDelayed(FRESH,5000);}}break;}//不能返回true,不然直接消费掉了return false;}});
    

操作代码

http://download.csdn.net/detail/wgyscsf/9523120

ListView刷新原理及实现相关推荐

  1. android ListView 刷新卡顿问题

    本人刚接触android开发,最近遇到一个关于ListView 刷新item一直卡顿的现象,进度条一直只刷新两次就结束了,灰常不明白,各种百度,各种找资料,什么线程什么的都试了遍,然并卵.一直到看到了 ...

  2. listview刷新与内部控件的监听

    困扰我多日的关于Android中的listview问题,今天终于完全解决了,首先讲一下到底遇到的是什么问题:(1)点击listview的item布局中的ImageButton按钮来获取相应的Textv ...

  3. 移动端下拉刷新原理和实例

    移动端的下拉刷新是一个很常见的功能,也有许多开源库实现了这个功能,不过为了学习,还是先自己写一个例子学习一下.其中用到了一些touch事件和一些DOM属性CSS3属性.直接上代码,代码里面有注释. & ...

  4. listview刷新_Flutter NestedScrollView 滑动折叠头部下拉刷新效果

    题记 -- 执剑天涯,从你的点滴积累开始,所及之处,必精益求精. Flutter是谷歌推出的最新的移动开发框架. 本实例运行效果如下 : //启动函数void main() { runApp(Root ...

  5. listview 刷新结束 监听_Flutter 开发从 0 到 1(四)ListView 下拉加载和加载更多

    在<APP 开发从 0 到 1(三)布局与 ListView>我们完成了 ListView,这篇文章将做 ListView 下拉加载和加载更多. ListView 下拉加载 Flutter ...

  6. android listview 刷新不正确,Android中设置ListView内容刷新问题

    最近在学习Android的listView控件时遇到了一个问题,如何添加一个Item到ListView中并及时的刷新出来.在网上查了很多帖子,很多人在问,也很多人在解答,但是总的来说都没找到详细的解决 ...

  7. html下拉刷新原理,科技常识:移动端下拉刷新头实现原理及代码实现

    科技常识:移动端下拉刷新头实现原理及代码实现 2021-05-24 21:23:20 • 互联网 今天小编跟大家讲解下有关移动端下拉刷新头实现原理及代码实现 ,相信小伙伴们对这个话题应该有所关注吧,小 ...

  8. Android ListView工作原理完全解析,带你从源码的角度彻底理解

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/44996879 在Android所有常用的原生控件当中,用法最复杂的应该就是List ...

  9. listview刷新(litepal)

    问题 如何单独刷新listview,并且不影响布局上的数据 litepal-到–>list数据表-到---->Adapter----到->显示在listview上. 要刷新listv ...

  10. SpringCloud Zuul(九)之路由自动刷新原理

    一.现象 发布新服务,然后在数据库配置了路由,使用服务路径访问404.然后重新发布新的服务,就可以继续访问得到 (1)配置了路由第一次访问 (2)重新发布后访问 二.分析 (1)查找Refreshab ...

最新文章

  1. OpenCV 腐蚀和膨胀
  2. java变量只声明未初始化是否可以直接使用?
  3. Bugku-CTF之前女友(SKCTF)
  4. .NET和Docker ,比翼双飞
  5. [Java基础]哈希值
  6. Springboot实现文件上传,并防止同文件重复上传
  7. linux_ELF静态注入
  8. Seesaw Loss:一种面向长尾目标检测的平衡损失函数
  9. Spring学习笔记:第一个Spring Boot程序HelloWorld
  10. 【安全】通过LAM(ldap-account-manager)来管理OpenLDAP
  11. haproxy keepalived_企业实战KeepAlived+Redis+Haproxy实现主从热备、负载均衡、秒级切换...
  12. java接收json字符串_JAVA后台接收前台传过来的json字符串并解析获得key 和value
  13. SQL关键字筛选数据
  14. 关于DIPS的DLL注入(第22章)
  15. window包管理器
  16. 什么是servlet ,servlet的作用
  17. python正则取反,一文搞定Python正则表达式
  18. python编程之TypeError: list expected at most 1 arguments, got 7
  19. 软件测试的工资高还是开发者工资高?
  20. 玩烂vue之vue练手项目

热门文章

  1. MATLAB 2018a Mac版安装激活教程
  2. matlab设计光栅,光栅原理及MATLAB仿真.doc
  3. JSP页面乱码的几种解决方案
  4. 发那科机器人示教器键盘_不限 发那科机器人示教器触摸屏急停按键失效维修...
  5. 周鸿祎——互联网业界的“搅局者”
  6. SVN 中文工具(Tools)
  7. mqtt测试工具(持续更新...)
  8. python开发简单计算器下载_如何运用Python编写简易计算器?
  9. 某学校买了一批计算机配置为,初中信息技术考试选择题
  10. cmd运行tomcat出现乱码