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. jQuery Live Query 插件

    http://www.cnblogs.com/sunjing/archive/2008/12/06/1349097.html 上篇日志里写到的那个问题其实有种更简单的解决办法,就是使用jquery的L ...

  2. JAVA_Android APK反编译就这么简单 详解(附图)

    在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用 ...

  3. [Android]新版的sdk中新建一个android应用,增加的PlaceholderFragment这个静态类发生的事情

    1,首先发生的是有两个布局xml,一个activity_main.xml,一个是fragment_main.xml一开始没在意,后来仔细看了原来是新功能的fragment概念等于多个场景在这个acti ...

  4. ApplicationContext更强的功能-学习笔记

    ---恢复内容开始--- 一.国际化支持 二.资源访问 三.事件传递 国际化支持 ApplicationContext继承了org.springframework.context.MessageRes ...

  5. websevice中runtime modeler error: Wrapper class com.ws.jaxws.Add is not found问题的解决办法

    查询了网上的资料,有以下解决办法: 1> 先用apt命令将主程序进行编译,然后生成一些java文件2> 升级JDK到版本jdk1.6u17或以后 这两种办法我没有试过,但是试了以下这种方法 ...

  6. 马克飞象 Markdown 使用和学习

    第三方学习网站 http://sspai.com/25137https://maxiang.io/ 使用工具:有道云笔记 https://note.youdao.com/ 新建时使用Mardown类型 ...

  7. rownum和rowid伪列

    select row employee_id,last name,salary from employees; select row employee_id,last name,salary from ...

  8. 【5集iCore3_ADP演示视频】5-3 iCore3应用开发平台摸校准

    iCore3双核心应用开发平台基于iCore3双核心板,包含ARM.FPGA.7寸液晶屏.双通道数字示波器.任意波发生器.电压表等模块,是一款专为电子爱好者设计的综合性电子学习系统. [视频简介]本视 ...

  9. 自动执行任务管理---TaskManage

    这篇主要配合数据使用 先说数据库 名字都很标准---------------------------------- ------------------------------------------ ...

  10. python第一站

    python 第一站,豆瓣-美国末日评论小爬虫 最近学习python,但是光是看书看视频学习,总是觉得掌握的不够扎实.所以就决定自己去写写爬虫,当带着目的性去学,也许更容易发现自己需要什么.这是酝酿多 ...