1. 引言:

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

2. 交互:

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

3. 效果图:



4. 程序实现:

[java]view plaincopy
  1. packagecom.focus.loading;
  2. importandroid.app.ListActivity;
  3. importandroid.os.Bundle;
  4. importandroid.os.Handler;
  5. importandroid.view.Gravity;
  6. importandroid.view.View;
  7. importandroid.view.ViewGroup;
  8. importandroid.widget.AbsListView;
  9. importandroid.widget.BaseAdapter;
  10. importandroid.widget.LinearLayout;
  11. importandroid.widget.ListView;
  12. importandroid.widget.ProgressBar;
  13. importandroid.widget.TextView;
  14. importandroid.widget.AbsListView.OnScrollListener;
  15. importandroid.widget.LinearLayout.LayoutParams;
  16. publicclassListViewLoadingActivityextendsListActivityimplements
  17. OnScrollListener{
  18. @Override
  19. publicvoidonCreate(BundlesavedInstanceState){
  20. super.onCreate(savedInstanceState);
  21. /**
  22. *"加载项"布局,此布局被添加到ListView的Footer中。
  23. */
  24. mLoadLayout=newLinearLayout(this);
  25. mLoadLayout.setMinimumHeight(60);
  26. mLoadLayout.setGravity(Gravity.CENTER);
  27. mLoadLayout.setOrientation(LinearLayout.HORIZONTAL);
  28. /**
  29. *向"加载项"布局中添加一个圆型进度条。
  30. */
  31. ProgressBarmProgressBar=newProgressBar(this);
  32. mProgressBar.setPadding(0,0,15,0);
  33. mLoadLayout.addView(mProgressBar,mProgressBarLayoutParams);
  34. /**
  35. *向"加载项"布局中添加提示信息。
  36. */
  37. TextViewmTipContent=newTextView(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. publicvoidonScroll(AbsListViewview,intmFirstVisibleItem,
  52. intmVisibleItemCount,intmTotalItemCount){
  53. mLastItem=mFirstVisibleItem+mVisibleItemCount-1;
  54. if(mListViewAdapter.count>mCount){
  55. mListView.removeFooterView(mLoadLayout);
  56. }
  57. }
  58. publicvoidonScrollStateChanged(AbsListViewview,intmScrollState){
  59. /**
  60. *当ListView滑动到最后一条记录时这时,我们会看到已经被添加到ListView的"加载项"布局,这时应该加载剩余数据。
  61. */
  62. if(mLastItem==mListViewAdapter.count
  63. &&mScrollState==OnScrollListener.SCROLL_STATE_IDLE){
  64. if(mListViewAdapter.count<=mCount){
  65. mHandler.postDelayed(newRunnable(){
  66. @Override
  67. publicvoidrun(){
  68. mListViewAdapter.count+=10;
  69. mListViewAdapter.notifyDataSetChanged();
  70. mListView.setSelection(mLastItem);
  71. }
  72. },1000);
  73. }
  74. }
  75. }
  76. classListViewAdapterextendsBaseAdapter{
  77. intcount=10;
  78. publicintgetCount(){
  79. returncount;
  80. }
  81. publicObjectgetItem(intposition){
  82. returnposition;
  83. }
  84. publiclonggetItemId(intposition){
  85. returnposition;
  86. }
  87. publicViewgetView(intposition,Viewview,ViewGroupparent){
  88. TextViewmTextView;
  89. if(view==null){
  90. mTextView=newTextView(ListViewLoadingActivity.this);
  91. }else{
  92. mTextView=(TextView)view;
  93. }
  94. mTextView.setText("Item"+position);
  95. mTextView.setTextSize(20f);
  96. mTextView.setGravity(Gravity.CENTER);
  97. mTextView.setHeight(60);
  98. returnmTextView;
  99. }
  100. }
  101. privateLinearLayoutmLoadLayout;
  102. privateListViewmListView;
  103. privateListViewAdaptermListViewAdapter=newListViewAdapter();
  104. privateintmLastItem=0;
  105. privateintmCount=41;
  106. privatefinalHandlermHandler=newHandler();
  107. privatefinalLayoutParamsmProgressBarLayoutParams=newLinearLayout.LayoutParams(
  108. LinearLayout.LayoutParams.WRAP_CONTENT,
  109. LinearLayout.LayoutParams.WRAP_CONTENT);
  110. privatefinalLayoutParamsmTipContentLayoutParams=newLinearLayout.LayoutParams(
  111. LinearLayout.LayoutParams.WRAP_CONTENT,
  112. LinearLayout.LayoutParams.WRAP_CONTENT);
  113. }

更多相关文章

  1. Android触摸滑动全解(三)——View坐标体系详解
  2. webView程序 第一次加载页面是出现白屏或是黑屏或是其他
  3. Android艺术开发探索第三章————View的事件体系(下)
  4. 【Android(安卓)如何置底一个View(附 前置声明layout布局文件中的
  5. android 群英传笔记----Android(安卓)scroll
  6. Android中so使用知识和问题总结以及插件开发过程中加载so的方案
  7. Android(安卓)修改字体,跳不过的 Typeface
  8. Android动态加载技术 简单易懂的介绍方式
  9. (4.2.2.2)【android开源工具】【Android(安卓)UI设计与开发】第17

随机推荐

  1. Web API身份认证解决方案之Basic基础认证
  2. C#内置泛型委托之Action委托
  3. php7和php5的详细对比
  4. C++设计模式中的观察者模式一起来看看
  5. [Android] 动态语言切换
  6. spotlight android app which likes spot
  7. Android用户定位Google Map显示地图
  8. Android(安卓)SSO 相关文章
  9. Android(安卓)ScrollView + ListView嵌套
  10. android cupcake源码编译问题