最近的项目中有通讯录这个模块,里面的通讯录涉及的联系人数量很大,导致在加载页面的时候有点卡,所以就必须得进行优化,优化的最终实现理论是什么?就是让ListView一次性加载的数据较少,后续根据用户操作{向下滑动}再加载更多的数据,避免了一次性加载数据导致程序运行不畅的问题;
在参考网上的一些方法之后,总觉得那些方法都不是我想要的,都是一个模子里面刻出来的,大多数都是加footerview,因为我的项目中的ListView的数据源是需要按照一定的顺序排列的,如果加载之后再进行排序又会导致程序运行不畅,所以我想要寻找一种个人认为更容易的方法;

实现思路:首先在adapter中保存全部的数据记录,在adapter中另外创建一个List保存当前要显示的数据记录;根据ListView的滚动状态判断是否滚动到最后一项,如果滚动到最后一项,并且还有数据没显示完的话就加载更多的数据;

下面是实现代码:
1、自定义Adapter

  1. public class AAAdapter extends BaseAdapter {
  2. private List<String> orign_list;
  3. private List<String> list;
  4. private LayoutInflater inflater;
  5.  
  6. private int getOrignSize() {
  7. return orign_list.size();
  8. }
  9.  
  10. @Override
  11. public int getCount() {
  12. return list.size();
  13. }
  14.  
  15. public void more() {
  16. int size = this.list.size();
  17. int orignsize = getOrignSize();
  18. if (size < orignsize) {
  19. List<String> toadd = orign_list.subList(size, size + 10 >= orignsize ? orignsize : size + 10);
  20.        // 注意上面的subList,判断当前显示的列表的长度加上每次要动态添加的数据的条数是否大于总列表长度,再判断加载多少条数据
  21. list.addAll(toadd);
  22. notifyDataSetChanged(); // 通知数据记录发生改变
           Log.e("ListSize", "" + list.size());
  23. }
  24. }
  25.  
  26. public AAAdapter(List<String> orign_list, Context context) {
  27. super();
  28. this.inflater = LayoutInflater.from(context);
  29. this.orign_list = orign_list;
  30. this.list = new ArrayList<String>();
  31. this.list.addAll(orign_list.subList(0, 19)); // 初次加载显示20条数据
  32. }
  33.  
  34. @Override
  35. public Object getItem(int position) {
  36. return list.get(position);
  37. }
  38.  
  39. @Override
  40. public long getItemId(int position) {
  41. return position;
  42. }
  43.  
  44. @Override
  45. public View getView(int position, View convertView, ViewGroup parent) {
  46. convertView = inflater.inflate(R.layout.ba, null);
  47. TextView tv = (TextView) convertView.findViewById(R.id.tv);
  48. tv.setText(list.get(position));
  49. return convertView;
  50. }
  51. }

2、修改Activity实现数据动态加载

  1. public class MainActivity extends Activity {
  2. AAAdapter adapter;
  3.  
  4. @Override
  5. protected void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.activity_main);
  8. ListView lv = (ListView) findViewById(R.id.lv);
  9. List<String> orign_list = new ArrayList<String>();
  10. for (int i = 0; i < 97; i++) {
  11. orign_list.add("item - " + i);
  12. }
  13. adapter = new AAAdapter(orign_list, getApplicationContext());
  14. lv.setAdapter(adapter);
  15. study(lv);
  16. }
  17.  
  18. public void study(ListView lv) { // 在getView方法里面对滚动状态做出相应的处理
  19. lv.setOnScrollListener(new OnScrollListener() {
  20. @Override
  21. public void onScrollStateChanged(AbsListView view, int scrollState) {
  22. switch (scrollState) {
  23. case OnScrollListener.SCROLL_STATE_FLING: // 正在滚动
  24. break;
  25. case OnScrollListener.SCROLL_STATE_IDLE: // 滚动完成
  26. break;
  27. case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL: // 正在滚动
  28. break;
  29. }
  30. }
  31.  
  32. @Override
  33. public void onScroll(AbsListView view, int firstVisibleItem,
  34. int visibleItemCount, int totalItemCount) {
  35. int lastIndex = firstVisibleItem + visibleItemCount - 1; // 获取当前可视的最后一项
  36. if (totalItemCount == lastIndex + 1) { // 已经显示到最后一项了
  37. adapter.more();
  38. }
  39. }
  40. });
  41. }
  42. }

下面是控制台打印出的当前显示List的大小,可以看到每次都是加了十条数据,最后不足十条的时候也是成功添加一剩余的所有数据记录;

Android ListView的优化的更多相关文章

  1. Android listview 的优化

    接[Android listview的应用][1] 在我们上一篇[Android listview的应用][1]中,我们的adapter中的getView()方法中每次都将布局重新加载一遍,这样就会导 ...

  2. Android ListView性能优化实例讲解

    前言: 对于ListView,大家绝对都不会陌生,只要是做过Android开发的人,哪有不用ListView的呢? 只要是用过ListView的人,哪有不关心对它性能优化的呢? 关于如何对ListVi ...

  3. Android Listview 性能优化

    首先我一般使用的适配器是BaseAdapter,其中有两个方法最主要,分别是: getCount,getView, 在对Listview 进行优化的时候,首先使用 convertview 和viewH ...

  4. Android ListView 全面优化

    结合昨天学习的多线程,今天又继续对ListView进行了优化,包括异步加载图片,滑动时暂停加载,滑动停止后再加载显示界面中的item. 综合ListView在使用时参考的多篇博客,这里对ListVie ...

  5. (翻译) Android ListView 性能优化指南

    本文翻译了Lucas Rocha的Performance Tips for Android’s ListView.这是一篇关于介绍如何提升ListView性能的文章,非常的优秀.使得我拜读之后,忍不住 ...

  6. android: ListView历次优化

    第一版: ListView一屏显示多少对象其内部就创建多少View对象.滑动时退出的缓存对象留给滑进去时调用getView传的convertView.因为如果每次都findViewById查找创建视图 ...

  7. android ListView优化

    android ListView通过优化重用历史缓存实现.listview相应的数据适配器一般使用自己定义BaseAdapter子类,重用历史缓冲区来提高性能. 例如,下面的示例代码演示: 1.lis ...

  8. Android之ListView性能优化——一行代码绑定数据——万能适配器

    如下图,加入现在有一个这样的需求图,你会怎么做?作为一个初学者,之前我都是直接用SimpleAdapter结合一个Item的布局来实现的,感觉这样实现起来很方便(基本上一行代码就可以实现),而且也没有 ...

  9. android ListView的介绍和优化

    xml设计 <?xml version="1.0"?> -<RelativeLayout tools:context=".MainActivity&qu ...

随机推荐

  1. Nginx+Tomcat多站点访问默认主页问题-狒狒完美解决-Q9715234

    <Engine name="Catalina" defaultHost="www.abc.com"> <Host name="www ...

  2. vscode 全透明背景图

    一.前言 08.02更新:已魔改插件 可以直接下载插件使用了 10.18跟新:已发布到vscode扩展  下载地址 下载后手动安装就ok了,具体配置安装后点开插件有说明的!!! 今天看到了博客园 这篇 ...

  3. linux-centos6②

  4. JEMTER简单的测试计划

    测试计划一 1)测试网站:http://www.geneedu.cn/和http://supu01.1688.com/ 2)测试目的是该网站在负载达到20 QPS 时的响应时间. 备注: QPS : ...

  5. leetcode-最大子序和(动态规划讲解)

    最大子序和(动态规划讲解) 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输 ...

  6. 《Git学习指南》学习笔记(三)

    多次提交 提交一般分未两步:add和commit. add将修改存入到索引(index)或叫暂存区(staging area)中. status命令 status命令会出现三种可能的状态: chang ...

  7. 使用bing或google来翻译网页

    google代码:在</head>之后插入 <meta name="google-translate-customization" content="4 ...

  8. (原创)白话KMP算法详解

    引子:BF暴力算法 KMP算法知名度相当高,燃鹅其理解难度以及代码实现对于初学数据结构和算法的同学并不友好,经过两天的总结,详细总结KMP算法如下: 初学串的模式匹配时,我们都会接触到,或者说应该能想 ...

  9. 【转】Backbone.js学习笔记(一)

    文章转自: http://segmentfault.com/a/1190000002386651 基本概念 前言 昨天开始学Backbone.js,写篇笔记记录一下吧,一直对MVC模式挺好奇的,也对j ...

  10. NIO初探

    NIO的前世今生 NIO又叫NonBlockingI/O,即非阻塞I/O.以此对应的,有一个更常见的IO(BIO),又叫Blocking I/O,即阻塞IO,两种都为Java的IO实现方案. NIO/ ...