1. 引言:

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

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

4. 程序实现: view plaincopy to clipboard

  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. }

推荐阅读:

查看原文 >>
相关文章