1. 引言:

为了提高ListView的效率和应用程序的性能,在Android应用程序中不应该一次性加载ListView所要显示的全部信息,而是采取分批加载策略,随着用户的滑动,动态的从后台加载所需的数据,并渲染到ListView组件中,这样可以极大的改善应用程序的性能和用户体验。

2. 交互:

进入ListView组件,首先预加载N条记录,当用户滑动到最后一条记录显示加载提示信息,并从后台加载N条数据,接着渲染UI界面。

3. 效果图:

4. 程序实现:

  1. package com.focus.loading;  
  2. import android.app.ListActivity;  
  3. import android.os.Bundle;  
  4. import android.os.Handler;  
  5. import android.view.Gravity;  
  6. import android.view.View;  
  7. import android.view.ViewGroup;  
  8. import android.widget.AbsListView;  
  9. import android.widget.BaseAdapter;  
  10. import android.widget.LinearLayout;  
  11. import android.widget.ListView;  
  12. import android.widget.ProgressBar;  
  13. import android.widget.TextView;  
  14. import android.widget.AbsListView.OnScrollListener;  
  15. import android.widget.LinearLayout.LayoutParams;  
  16. public class ListViewLoadingActivity extends ListActivity implements  
  17.         OnScrollListener {  
  18.     @Override  
  19.     public void onCreate(Bundle savedInstanceState) {  
  20.         super.onCreate(savedInstanceState);  
  21.         /** 
  22.          * "加载项"布局,此布局被添加到ListView的Footer中。 
  23.          */  
  24.         mLoadLayout = new LinearLayout(this);  
  25.         mLoadLayout.setMinimumHeight(60);  
  26.         mLoadLayout.setGravity(Gravity.CENTER);  
  27.         mLoadLayout.setOrientation(LinearLayout.HORIZONTAL);  
  28.         /** 
  29.          * 向"加载项"布局中添加一个圆型进度条。 
  30.          */  
  31.         ProgressBar mProgressBar = new ProgressBar(this);  
  32.         mProgressBar.setPadding(0, 0, 15, 0);  
  33.         mLoadLayout.addView(mProgressBar, mProgressBarLayoutParams);  
  34.         /** 
  35.          * 向"加载项"布局中添加提示信息。 
  36.          */  
  37.         TextView mTipContent = new TextView(this);  
  38.         mTipContent.setText("加载中...");  
  39.         mLoadLayout.addView(mTipContent, mTipContentLayoutParams);  
  40.         /** 
  41.          * 获取ListView组件,并将"加载项"布局添加到ListView组件的Footer中。 
  42.          */  
  43.         mListView = getListView();  
  44.         mListView.addFooterView(mLoadLayout);  
  45.         /** 
  46.          * 组ListView组件设置Adapter,并设置滑动监听事件。 
  47.          */  
  48.         setListAdapter(mListViewAdapter);  
  49.         mListView.setOnScrollListener(this);  
  50.     }  
  51.     public void onScroll(AbsListView view, int mFirstVisibleItem,  
  52.             int mVisibleItemCount, int mTotalItemCount) {  
  53.         mLastItem = mFirstVisibleItem + mVisibleItemCount - 1;  
  54.         if (mListViewAdapter.count > mCount) {  
  55.             mListView.removeFooterView(mLoadLayout);  
  56.         }  
  57.     }  
  58.     public void onScrollStateChanged(AbsListView view, int mScrollState) {  
  59.           
  60.         /** 
  61.          * 当ListView滑动到最后一条记录时这时,我们会看到已经被添加到ListView的"加载项"布局, 这时应该加载剩余数据。 
  62.          */  
  63.         if (mLastItem == mListViewAdapter.count  
  64.                 && mScrollState == OnScrollListener.SCROLL_STATE_IDLE) {  
  65.             if (mListViewAdapter.count <= mCount) {  
  66.                 mHandler.postDelayed(new Runnable() {  
  67.                     @Override  
  68.                     public void run() {  
  69.                         mListViewAdapter.count += 10;  
  70.                         mListViewAdapter.notifyDataSetChanged();  
  71.                         mListView.setSelection(mLastItem);  
  72.                     }  
  73.                 }, 1000);  
  74.             }  
  75.         }  
  76.     }  
  77.     class ListViewAdapter extends BaseAdapter {  
  78.         int count = 10;  
  79.         public int getCount() {  
  80.             return count;  
  81.         }  
  82.         public Object getItem(int position) {  
  83.             return position;  
  84.         }  
  85.         public long getItemId(int position) {  
  86.             return position;  
  87.         }  
  88.         public View getView(int position, View view, ViewGroup parent) {  
  89.             TextView mTextView;  
  90.             if (view == null) {  
  91.                 mTextView = new TextView(ListViewLoadingActivity.this);  
  92.             } else {  
  93.                 mTextView = (TextView) view;  
  94.             }  
  95.             mTextView.setText("Item " + position);  
  96.             mTextView.setTextSize(20f);  
  97.             mTextView.setGravity(Gravity.CENTER);  
  98.             mTextView.setHeight(60);  
  99.             return mTextView;  
  100.         }  
  101.     }  
  102.     private LinearLayout mLoadLayout;  
  103.     private ListView mListView;  
  104.     private ListViewAdapter mListViewAdapter = new ListViewAdapter();  
  105.     private int mLastItem = 0;  
  106.     private int mCount = 41;  
  107.     private final Handler mHandler = new Handler();  
  108.     private final LayoutParams mProgressBarLayoutParams = new LinearLayout.LayoutParams(  
  109.             LinearLayout.LayoutParams.WRAP_CONTENT,  
  110.             LinearLayout.LayoutParams.WRAP_CONTENT);  
  111.     private final LayoutParams mTipContentLayoutParams = new LinearLayout.LayoutParams(  
  112.             LinearLayout.LayoutParams.WRAP_CONTENT,  
  113.             LinearLayout.LayoutParams.WRAP_CONTENT);  
  114. }  
 
 

Android中ListView动态加载数据的更多相关文章

  1. Android中ListView分页加载数据

    public class MainActivity extends Activity { private ListView listView=null; //listview的数据填充器 privat ...

  2. Android 自定义ListView动态加载数据

    我们都知道网络取数据是耗时操作,如果我们一次性请求所有数据,假如数据量不多那还可以接受,但是如果数据量特别多,那么带来的后果就是用户的愤怒(用户是很没有耐心的),所以这时候我们就需要动态的加载数据,分 ...

  3. Android中ListView异步加载数据

    1.主Activity public class MainActivity extends Activity { private ListView listView; private ArrayLis ...

  4. AppCan学习笔记----关闭页面listview动态加载数据

    AppCan页面关闭 AppCan 的页面是由两个HTML组成,如果要完全关闭的话需要在主HTML eg.index.html中关闭,关闭方法:appcan.window.close(-1); 管道 ...

  5. 分享个刚写好的 android 的 ListView 动态加载类,功能全而代码少。

    (转载声明出处:http://www.cnblogs.com/linguanh/) 简介:      该ListView 实现动态加载数据,为了方便用户充分地自定义自己的数据源.点击事件,等核心操作, ...

  6. Android中的动态加载机制

    在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本 ...

  7. Android Scrollview嵌套下listView动态加载数据,解决onScrollChanged执行多次数据重复问题

    这一篇博客和上一篇讲的都是listView的动态加载,但有所不同的是,本篇的listView是嵌套在ScrollView下的,有时候在一个Activity中可能分为好几个模块,由于展示的需要(手机屏幕 ...

  8. Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案

    我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图片错位.重复.闪烁等问题,其实这些问题总结起来就是一个问题,我们需要对这些问题进行ListView的优化. 比如L ...

  9. android 中使用缓存加载数据

    最近app快完工了,但是很多列表加载,新闻咨询等数据一直从网络请求,速度很慢,影响用户体验,所以寻思用缓存来加载一些更新要求不太高的数据 废话不多说,上代码 欢迎转载,但请保留文章原始出处:)  博客 ...

随机推荐

  1. Linux crontab 命令格式与详细例子

    基本格式 :* * * * * command分 时 日 月 周 命令 第1列表示分钟1-59 每分钟用*或者 */1表示第2列表示小时1-23(0表示0点)第3列表示日期1-31第4列表示月份1-1 ...

  2. Java_动态重新加载Class总结

    在此记载Java动态重新加载Class的点点滴滴,实现之前也在网上看了很多文章,但发现不是很清晰,后来发现总结,看源码实现还是最靠谱. 直接上代码: package com.lkb.autoCode. ...

  3. 07@Pattern_Note_命令模式

    前言 20160109: 今天开始看命令模式,主要从概念和实现来深入理解该模式 概念理解[部分来自摘录] 概念 通常来说,"行为请求者"与"行为实现者"是紧耦合 ...

  4. STL三种标准容器

    顺序性容器 vector:从后面快速的插入与删除,直接访问任何元素 deque:从前面或后面快速的插入与删除,直接访问任何元素 list: 双链表,从任何地方快速的插入与删除 关联容器 set:快速查 ...

  5. F-并查集

    Problem F Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 60000/30000K (Java/Other) Total Sub ...

  6. 泛型:HashMap的用法--输入字母输出数目

    public static void main(String[] args) { Map <String ,Integer> m =new HashMap<String , Inte ...

  7. eclipse从下载到使用

    经常遇到有同学问我: 为啥我的eclipse没有你说的那个东西? 那是咱两选择的平台不一样 我的eclipse为啥和你的那个长的不一样? 那是咱两选择的版本不一样 为什么我的打开报XXX错误? ... ...

  8. 本周psp

      本周PSP 类别 内容 开始时间 中止时间 终止时间 总用时 产品计划会议 定义产品的用户需求,以及从这个产品中得到什么.解决啥问题 18:00 0 20:00 120分钟 撰写博客 会议记录与个 ...

  9. python类型转换

    1.数字转字符串 str(42) == "42" 2.字符串转数字 int("42") == 42 3.字符转ascii码 ord("a") ...

  10. scala的面向对象编程

    1.scala的简单编程 2.构造方法 辅助构造函数是在主构造函数没有的情况下,执行的构造函数. 3.object的介绍 4.半生类和半生对象 5.半生的案例程序(半生类可以调用半生) 6.apply ...