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

推薦閱讀:

查看原文 >>
相關文章