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. 2016-2017 ACM-ICPC, NEERC, Moscow Subregional Contest

    A. Altitude 从小到大加入每个数,用set查找前驱和后继即可. 时间复杂度$O(n\log n)$. #include <bits/stdc++.h> using namespa ...

  2. 天猫登录源码 POST C#

    HttpHelper 请从网络中搜索: public partial class LoginTMall : Form { public LoginTMall() { InitializeCompone ...

  3. Cenos7 编译安装 Mariadb Nginx PHP Memcache ZendOpcache (实测 笔记 Centos 7.0 + Mariadb 10.0.15 + Nginx 1.6.2 + PHP 5.5.19)

    环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G,双网卡) 系统版本:CentOS-7.0-1406-x86_64-DVD.iso 安装步骤: 1.准备 1.1 显示系统版 ...

  4. bzoj4511:[Usaco2016 Jan]Subsequences Summing to Sevens

    题目大意:给个序列,求最长的连续子序列使其为7的倍数 又是一道令人欢喜的不用怎么用脑的水题.. 边读入,边计算前缀和 分别保存前缀和%7结果为1,2,3,4,5,6的第一次的位置 然后减一减就知道长度 ...

  5. JavaScript 入门教程四 语言基础【3】

    一.数据类型介绍: String 1.是使用 Unicode 字符组成的字符序列.所以可以容纳各种语言. 2.字符串可以使用双引号(“”)或者单引号('')表示,但必须成对出现. 3.转移序列使用 \ ...

  6. p4lang/switch make bm-switchsai 出现内存不足导致的Error

    报错如下: Compiling : bm::dc.cpp g++: internal compiler error: Killed (program cc1plus) Please submit a ...

  7. Ubuntu使用阿里云软件源

    如果在安装Ubuntu时,选择的地区为美国,建议更新为阿里云或国内 软件源 sudo sed -i s/archive.ubuntu.com/mirrors.aliyun.com/g /etc/apt ...

  8. poj2488骑士马走

    #include<stdio.h> #include<stdlib.h> int data[100][100] = {0}; int Dx[8] = {-1,1,-2,2,-2 ...

  9. 利用mask layer 勾View

    #define SCREEN_WIDTH [[UIScreen mainScreen] bounds].size.width #define SCREEN_HEIGHT [[UIScreen main ...

  10. 兼容iOS 10 资料整理笔记

    原文链接:http://www.jianshu.com/p/0cc7aad638d9 1.Notification(通知) 自从Notification被引入之后,苹果就不断的更新优化,但这些更新优化 ...