Android中ListView动态加载数据
1. 引言:
为了提高ListView的效率和应用程序的性能,在Android应用程序中不应该一次性加载ListView所要显示的全部信息,而是采取分批加载策略,随着用户的滑动,动态的从后台加载所需的数据,并渲染到ListView组件中,这样可以极大的改善应用程序的性能和用户体验。
2. 交互:
进入ListView组件,首先预加载N条记录,当用户滑动到最后一条记录显示加载提示信息,并从后台加载N条数据,接着渲染UI界面。
3. 效果图:

4. 程序实现:
- package com.focus.loading;
- import android.app.ListActivity;
- import android.os.Bundle;
- import android.os.Handler;
- import android.view.Gravity;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.AbsListView;
- import android.widget.BaseAdapter;
- import android.widget.LinearLayout;
- import android.widget.ListView;
- import android.widget.ProgressBar;
- import android.widget.TextView;
- import android.widget.AbsListView.OnScrollListener;
- import android.widget.LinearLayout.LayoutParams;
- public class ListViewLoadingActivity extends ListActivity implements
- OnScrollListener {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- /**
- * "加载项"布局,此布局被添加到ListView的Footer中。
- */
- mLoadLayout = new LinearLayout(this);
- mLoadLayout.setMinimumHeight(60);
- mLoadLayout.setGravity(Gravity.CENTER);
- mLoadLayout.setOrientation(LinearLayout.HORIZONTAL);
- /**
- * 向"加载项"布局中添加一个圆型进度条。
- */
- ProgressBar mProgressBar = new ProgressBar(this);
- mProgressBar.setPadding(0, 0, 15, 0);
- mLoadLayout.addView(mProgressBar, mProgressBarLayoutParams);
- /**
- * 向"加载项"布局中添加提示信息。
- */
- TextView mTipContent = new TextView(this);
- mTipContent.setText("加载中...");
- mLoadLayout.addView(mTipContent, mTipContentLayoutParams);
- /**
- * 获取ListView组件,并将"加载项"布局添加到ListView组件的Footer中。
- */
- mListView = getListView();
- mListView.addFooterView(mLoadLayout);
- /**
- * 组ListView组件设置Adapter,并设置滑动监听事件。
- */
- setListAdapter(mListViewAdapter);
- mListView.setOnScrollListener(this);
- }
- public void onScroll(AbsListView view, int mFirstVisibleItem,
- int mVisibleItemCount, int mTotalItemCount) {
- mLastItem = mFirstVisibleItem + mVisibleItemCount - 1;
- if (mListViewAdapter.count > mCount) {
- mListView.removeFooterView(mLoadLayout);
- }
- }
- public void onScrollStateChanged(AbsListView view, int mScrollState) {
- /**
- * 当ListView滑动到最后一条记录时这时,我们会看到已经被添加到ListView的"加载项"布局, 这时应该加载剩余数据。
- */
- if (mLastItem == mListViewAdapter.count
- && mScrollState == OnScrollListener.SCROLL_STATE_IDLE) {
- if (mListViewAdapter.count <= mCount) {
- mHandler.postDelayed(new Runnable() {
- @Override
- public void run() {
- mListViewAdapter.count += 10;
- mListViewAdapter.notifyDataSetChanged();
- mListView.setSelection(mLastItem);
- }
- }, 1000);
- }
- }
- }
- class ListViewAdapter extends BaseAdapter {
- int count = 10;
- public int getCount() {
- return count;
- }
- public Object getItem(int position) {
- return position;
- }
- public long getItemId(int position) {
- return position;
- }
- public View getView(int position, View view, ViewGroup parent) {
- TextView mTextView;
- if (view == null) {
- mTextView = new TextView(ListViewLoadingActivity.this);
- } else {
- mTextView = (TextView) view;
- }
- mTextView.setText("Item " + position);
- mTextView.setTextSize(20f);
- mTextView.setGravity(Gravity.CENTER);
- mTextView.setHeight(60);
- return mTextView;
- }
- }
- private LinearLayout mLoadLayout;
- private ListView mListView;
- private ListViewAdapter mListViewAdapter = new ListViewAdapter();
- private int mLastItem = 0;
- private int mCount = 41;
- private final Handler mHandler = new Handler();
- private final LayoutParams mProgressBarLayoutParams = new LinearLayout.LayoutParams(
- LinearLayout.LayoutParams.WRAP_CONTENT,
- LinearLayout.LayoutParams.WRAP_CONTENT);
- private final LayoutParams mTipContentLayoutParams = new LinearLayout.LayoutParams(
- LinearLayout.LayoutParams.WRAP_CONTENT,
- LinearLayout.LayoutParams.WRAP_CONTENT);
- }
Android中ListView动态加载数据的更多相关文章
- Android中ListView分页加载数据
public class MainActivity extends Activity { private ListView listView=null; //listview的数据填充器 privat ...
- Android 自定义ListView动态加载数据
我们都知道网络取数据是耗时操作,如果我们一次性请求所有数据,假如数据量不多那还可以接受,但是如果数据量特别多,那么带来的后果就是用户的愤怒(用户是很没有耐心的),所以这时候我们就需要动态的加载数据,分 ...
- Android中ListView异步加载数据
1.主Activity public class MainActivity extends Activity { private ListView listView; private ArrayLis ...
- AppCan学习笔记----关闭页面listview动态加载数据
AppCan页面关闭 AppCan 的页面是由两个HTML组成,如果要完全关闭的话需要在主HTML eg.index.html中关闭,关闭方法:appcan.window.close(-1); 管道 ...
- 分享个刚写好的 android 的 ListView 动态加载类,功能全而代码少。
(转载声明出处:http://www.cnblogs.com/linguanh/) 简介: 该ListView 实现动态加载数据,为了方便用户充分地自定义自己的数据源.点击事件,等核心操作, ...
- Android中的动态加载机制
在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优势.本 ...
- Android Scrollview嵌套下listView动态加载数据,解决onScrollChanged执行多次数据重复问题
这一篇博客和上一篇讲的都是listView的动态加载,但有所不同的是,本篇的listView是嵌套在ScrollView下的,有时候在一个Activity中可能分为好几个模块,由于展示的需要(手机屏幕 ...
- Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案
我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图片错位.重复.闪烁等问题,其实这些问题总结起来就是一个问题,我们需要对这些问题进行ListView的优化. 比如L ...
- android 中使用缓存加载数据
最近app快完工了,但是很多列表加载,新闻咨询等数据一直从网络请求,速度很慢,影响用户体验,所以寻思用缓存来加载一些更新要求不太高的数据 废话不多说,上代码 欢迎转载,但请保留文章原始出处:) 博客 ...
随机推荐
- Linux crontab 命令格式与详细例子
基本格式 :* * * * * command分 时 日 月 周 命令 第1列表示分钟1-59 每分钟用*或者 */1表示第2列表示小时1-23(0表示0点)第3列表示日期1-31第4列表示月份1-1 ...
- Java_动态重新加载Class总结
在此记载Java动态重新加载Class的点点滴滴,实现之前也在网上看了很多文章,但发现不是很清晰,后来发现总结,看源码实现还是最靠谱. 直接上代码: package com.lkb.autoCode. ...
- 07@Pattern_Note_命令模式
前言 20160109: 今天开始看命令模式,主要从概念和实现来深入理解该模式 概念理解[部分来自摘录] 概念 通常来说,"行为请求者"与"行为实现者"是紧耦合 ...
- STL三种标准容器
顺序性容器 vector:从后面快速的插入与删除,直接访问任何元素 deque:从前面或后面快速的插入与删除,直接访问任何元素 list: 双链表,从任何地方快速的插入与删除 关联容器 set:快速查 ...
- F-并查集
Problem F Time Limit : 2000/1000ms (Java/Other) Memory Limit : 60000/30000K (Java/Other) Total Sub ...
- 泛型:HashMap的用法--输入字母输出数目
public static void main(String[] args) { Map <String ,Integer> m =new HashMap<String , Inte ...
- eclipse从下载到使用
经常遇到有同学问我: 为啥我的eclipse没有你说的那个东西? 那是咱两选择的平台不一样 我的eclipse为啥和你的那个长的不一样? 那是咱两选择的版本不一样 为什么我的打开报XXX错误? ... ...
- 本周psp
本周PSP 类别 内容 开始时间 中止时间 终止时间 总用时 产品计划会议 定义产品的用户需求,以及从这个产品中得到什么.解决啥问题 18:00 0 20:00 120分钟 撰写博客 会议记录与个 ...
- python类型转换
1.数字转字符串 str(42) == "42" 2.字符串转数字 int("42") == 42 3.字符转ascii码 ord("a") ...
- scala的面向对象编程
1.scala的简单编程 2.构造方法 辅助构造函数是在主构造函数没有的情况下,执行的构造函数. 3.object的介绍 4.半生类和半生对象 5.半生的案例程序(半生类可以调用半生) 6.apply ...