ListView动态加载数据

简介:

  当listview需要加载的数据过多时,若一次性载入则速度会相当缓慢,影响用户体验,这时候就需要动态加载数据,即每次载入固定长度的数据,android market的listview就是采用这种方式,使得加载看起来很平滑,响应速度很快,有助于提高用户体验。
  首先,要实现动态加载首先需要在获取数据时每次在上次获取到的数据之后的位置开始取得固定长度的数据,可通过"select * from TableName LIMIT m OFFSET n"语句实现,其中m是要取得数据的长度,n是数据的偏移量。 
  然后,在Activity中需要重写listview的onScroll方法,在onScroll中添加判断条件,当上一次加载的数据显示完并滑动到底部之后需要再次获取数据,可以在UI Thread中在开启一个线程去加载数据,加载数据时应弹出一个试图提示用户正在加载。

  最后,加载数据的线程处理完毕后,刷新ListView。

  以下是实现动态加载的主要步骤:

 
  1. //加载数据的方法 
  2.  
  3. private void fillAdapter(int count, int begin) { 
  4.         // TODO Auto-generated method stub 
  5.         SQLiteOpenHelper mSQLiteOpenHelper = new SQLiteOpenHelper ( 
  6.                 this); 
  7.         Cursor c= mSQLiteOpenHelper .getDynamicListViewData(count, offset); 
  8.  

 

 
  1. //监听listview的onScroll方法 
  2.  
  3. OnScrollListener listScroll = new OnScrollListener() { 
  4.  
  5.         @Override 
  6.         public void onScrollStateChanged(AbsListView view, int scrollState) { 
  7.             // TODO Auto-generated method stub 
  8.         } 
  9.  
  10.         @Override 
  11.         public void onScroll(AbsListView view, int firstVisibleItem, 
  12.                 int visibleItemCount, int totalItemCount) { 
  13.             if(isLoading) //正在加载时就不要让在执行活动触发事件 
  14.                 return
  15.             if (firstVisibleItem + visibleItemCount == totalItemCount) { 
  16.                 // 开线程去获取数据 
  17.                 if (totalItemCount <= totalItemsCount) { 
  18.                     Integer[] params = new Integer[] { 25, currentItemCount }; 
  19.  
  20.                     mAsynchTask = new AsynchTask(); 
  21.                     mAsynchTask.execute(params); 
  22.                 } else { 
  23.                     Toast.makeText(EventTracker.this"there is no data!"
  24.                             Toast.LENGTH_SHORT).show(); 
  25.                 } 
  26.             } 
  27.         } 
  28.     }; 

 

 

 
  1. //通过AsyncTask更方便的实现多线程管理,使得加载效果更平滑   
  2.  
  3. private class AsynchTask extends AsyncTask<Integer, Void, Void> { 
  4.         @Override 
  5.         /**将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。 
  6.          * 这里将主要负责执行那些很耗时的后台计算工作。可以调用 publishProgress方法 
  7.          * 来更新实时的任务进度。该方法是抽象方法,子类必须实现。 */ 
  8.         protected Void doInBackground(Integer... params) { 
  9.             fillAdapter(params[0], params[1]); 
  10.             return null
  11.         } 
  12.  
  13.   @Override 
  14.         /** 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用, 
  15.          * 后台的计算结果将通过该方法传递到UI thread. 
  16.          * */ 
  17.         protected void onPreExecute() { 
  18.  
  19. //loadingView为自定义的一个dialog,用于提示用户正在加载 
  20.             mEventListView.addFooterView(loadingView); 
  21.             isLoading=true
  22.         } 
  23.  
  24.  
  25.         @Override 
  26.         /** 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用, 
  27.          * 后台的计算结果将通过该方法传递到UI thread. 
  28.          * */ 
  29.         protected void onPostExecute(Void result) {      
  30.             bindAdapter(); 
  31.             mListView.removeFooterView(loadingView); 
  32.             mListView.setSelection(currentItemCount); 
  33.             currentItemCount += 25;//每次加载25列,偏移量也递增25 
  34.             isLoading=false
  35.         } 
  36.     } 

 

 
  1. 数据库中方法如下: 
  2. public Cursor getDynamicListViewData(int count, int offset) { 
  3.         return getReadableDatabase().rawQuery( 
  4.                 "select * from TableName limit " + count + "offset" + offset, 
  5.                 null); 
  6.     } 

 

本文转自HDDevTeam 51CTO博客,原文链接:http://blog.51cto.com/hddev/651517,如需转载请自行联系原作者

相关文章
|
网络协议
使用MPLS LDP解决BGP路由黑洞的问题
MPLS LDP默认不为BGP路由分配标签
|
SQL Java 数据库连接
Mybatis系列(一)之Mybatis入门和环境搭建
Mybatis系列(一)之Mybatis入门和环境搭建
|
jenkins 持续交付 Docker
Jenkins - 插件安装失败处理方法
Jenkins - 插件安装失败处理方法
9971 1
Jenkins - 插件安装失败处理方法
|
SQL 数据库
商城数据库表设计介绍
商城数据库表设计介绍
2016 0
商城数据库表设计介绍
|
网络协议 Ubuntu 前端开发
如何在操作使用ufw设置防火墙
如何在操作使用ufw设置防火墙
|
JavaScript 测试技术 UED
解决 Vue 项目中 Tree shaking 无法去除某些模块
【10月更文挑战第23天】解决 Vue 项目中 Tree shaking 无法去除某些模块的问题需要综合考虑多种因素,通过仔细分析、排查和优化,逐步提高 Tree shaking 的效果,为项目带来更好的性能和用户体验。同时,持续关注和学习相关技术的发展,不断探索新的解决方案,以适应不断变化的项目需求。
|
Linux 编译器 C语言
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
【Linux快速入门(一)】Linux与ROS学习之编译基础(gcc编译)
271 2
|
JavaScript Java 测试技术
基于Java的人事管理系统设计和实现(源码+LW+部署讲解)
基于Java的人事管理系统设计和实现(源码+LW+部署讲解)
208 7
|
SQL 安全 Devops
DevOps流水线设计的最佳实践
谈到到DevOps,持续交付流水线是绕不开的一个话题,相对于其他实践,通过流水线来实现快速高质量的交付价值是相对能快速见效的,特别对于开发测试人员,能够获得实实在在的收益。很多文章介绍流水线,不管是jenkins,gitlab-ci, 流水线,还是drone, github action 流水线, 文章都很多,但是不管什么工具,流水线设计的思路是一致的。于此同时,在实践过程中,发现大家对流水像有些误区,不是一大堆流水线,就是一个流水线调一个超级复杂的脚本,各种硬编码和环境依赖,所以希望通过这篇文章能够给大家分享自己对于Pipeline流水线的设计心得体会。
1525 1
|
搜索推荐 程序员 Windows
我idea的Translation插件坏了?
我idea的Translation插件坏了?
1082 0