`

Android中ListView分页加载数据

 
阅读更多

Android应用开发中,采用ListView组件来展示数据是很常用的功能,当一个应用要展现很多的数据时,一般情况下都不会把所有的数据一次就展示出来,而是通过分页的形式来展示数据,个人觉得这样会有更好的用户体验。因此,很多应用都是采用分批次加载的形式来获取用户所需的数据。例如:微博客户端可能会在用户滑动至列表底端时自动加载下一页数据,也可能在底部放置一个"查看更多"按钮,用户点击后,加载下一页数据。

下面通过一个Demo来展示ListView功能如何实现:该Demo通过在ListView列表的底部添加一个“查看更多...”按钮来加载新闻(模拟新闻客户端)分页数据。同时限定每次加载10条记录,但完全加载完数据后,就把ListView列表底部视图“查看更多...”删除。假设加载的数据总数为 38 条记录。先看下该Demo工程的程序结构图:


其中包 com.andyidea.bean中News.java类是新闻实体类,包com.andyidea.listview中paginationListViewActivity.java类是用来展示ListView列表。布局layout中包含三个布局文件,分别为:list_item.xml , loadmore.xml , main.xml 。下面分别贴下源码:

layout中的 list_item.xml源码:

  1. <spanstyle="font-size:13px;"><?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. android:orientation="vertical">
  7. <TextView
  8. android:id="@+id/newstitle"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"/>
  11. <TextView
  12. android:id="@+id/newscontent"
  13. android:layout_width="fill_parent"
  14. android:layout_height="wrap_content"/>
  15. </LinearLayout></span>

layout中loadmore.xml源码:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent">
  6. <Button
  7. android:id="@+id/loadMoreButton"
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:text="查看更多..."/>
  11. </LinearLayout>

layout中main.xml源码:

  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent">
  6. <ListView
  7. android:id="@+id/lvNews"
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"/>
  10. </LinearLayou

包 com.andyidea.bean中News.java类源码:

  1. packagecom.andyidea.bean;
  2. /**
  3. *新闻实体类
  4. *@authorAndy.Chen
  5. *@mailChenjunjun.ZJ@gmail.com
  6. *
  7. */
  8. publicclassNews{
  9. privateStringtitle;//标题
  10. privateStringcontent;//内容
  11. publicStringgetTitle(){
  12. returntitle;
  13. }
  14. publicvoidsetTitle(Stringtitle){
  15. this.title=title;
  16. }
  17. publicStringgetContent(){
  18. returncontent;
  19. }
  20. publicvoidsetContent(Stringcontent){
  21. this.content=content;
  22. }
  23. }

包com.andyidea.listview中paginationListViewActivity.java类源码:

  1. packagecom.andyidea.listview;
  2. importjava.util.ArrayList;
  3. importjava.util.List;
  4. importcom.andyidea.bean.News;
  5. importandroid.app.Activity;
  6. importandroid.os.Bundle;
  7. importandroid.os.Handler;
  8. importandroid.util.Log;
  9. importandroid.view.View;
  10. importandroid.view.ViewGroup;
  11. importandroid.widget.AbsListView;
  12. importandroid.widget.AbsListView.OnScrollListener;
  13. importandroid.widget.BaseAdapter;
  14. importandroid.widget.Button;
  15. importandroid.widget.ListView;
  16. importandroid.widget.TextView;
  17. importandroid.widget.Toast;
  18. publicclassPaginationListViewActivityextendsActivityimplementsOnScrollListener{
  19. privateListViewlistView;
  20. privateintvisibleLastIndex=0;//最后的可视项索引
  21. privateintvisibleItemCount;//当前窗口可见项总数
  22. privateintdatasize=38;//模拟数据集的条数
  23. privatePaginationAdapteradapter;
  24. privateViewloadMoreView;
  25. privateButtonloadMoreButton;
  26. privateHandlerhandler=newHandler();
  27. /**Calledwhentheactivityisfirstcreated.*/
  28. @Override
  29. publicvoidonCreate(BundlesavedInstanceState){
  30. super.onCreate(savedInstanceState);
  31. setContentView(R.layout.main);
  32. loadMoreView=getLayoutInflater().inflate(R.layout.loadmore,null);
  33. loadMoreButton=(Button)loadMoreView.findViewById(R.id.loadMoreButton);
  34. loadMoreButton.setOnClickListener(newView.OnClickListener(){
  35. @Override
  36. publicvoidonClick(Viewv){
  37. loadMoreButton.setText("正在加载中...");//设置按钮文字
  38. handler.postDelayed(newRunnable(){
  39. @Override
  40. publicvoidrun(){
  41. loadMoreData();
  42. adapter.notifyDataSetChanged();
  43. loadMoreButton.setText("查看更多...");//恢复按钮文字
  44. }
  45. },2000);
  46. }
  47. });
  48. listView=(ListView)findViewById(R.id.lvNews);
  49. listView.addFooterView(loadMoreView);//设置列表底部视图
  50. initializeAdapter();
  51. listView.setAdapter(adapter);
  52. listView.setOnScrollListener(this);
  53. }
  54. @Override
  55. publicvoidonScrollStateChanged(AbsListViewview,intscrollState){
  56. intitemsLastIndex=adapter.getCount()-1;//数据集最后一项的索引
  57. intlastIndex=itemsLastIndex+1;
  58. if(scrollState==OnScrollListener.SCROLL_STATE_IDLE
  59. &&visibleLastIndex==lastIndex){
  60. //如果是自动加载,可以在这里放置异步加载数据的代码
  61. }
  62. }
  63. @Override
  64. publicvoidonScroll(AbsListViewview,intfirstVisibleItem,
  65. intvisibleItemCount,inttotalItemCount){
  66. this.visibleItemCount=visibleItemCount;
  67. visibleLastIndex=firstVisibleItem+visibleItemCount-1;
  68. Log.e("=========================","========================");
  69. Log.e("firstVisibleItem=",firstVisibleItem+"");
  70. Log.e("visibleItemCount=",visibleItemCount+"");
  71. Log.e("totalItemCount=",totalItemCount+"");
  72. Log.e("=========================","========================");
  73. //如果所有的记录选项等于数据集的条数,则移除列表底部视图
  74. if(totalItemCount==datasize+1){
  75. listView.removeFooterView(loadMoreView);
  76. Toast.makeText(this,"数据全部加载完!",Toast.LENGTH_LONG).show();
  77. }
  78. }
  79. /**
  80. *初始化ListView的适配器
  81. */
  82. privatevoidinitializeAdapter(){
  83. List<News>news=newArrayList<News>();
  84. for(inti=1;i<=10;i++){
  85. Newsitems=newNews();
  86. items.setTitle("Title"+i);
  87. items.setContent("ThisisNewsContent"+i);
  88. news.add(items);
  89. }
  90. adapter=newPaginationAdapter(news);
  91. }
  92. /**
  93. *加载更多数据
  94. */
  95. privatevoidloadMoreData(){
  96. intcount=adapter.getCount();
  97. if(count+10<=datasize){
  98. for(inti=count+1;i<=count+10;i++){
  99. Newsitem=newNews();
  100. item.setTitle("Title"+i);
  101. item.setContent("ThisisNewsContent"+i);
  102. adapter.addNewsItem(item);
  103. }
  104. }else{
  105. for(inti=count+1;i<=datasize;i++){
  106. Newsitem=newNews();
  107. item.setTitle("Title"+i);
  108. item.setContent("ThisisNewsContent"+i);
  109. adapter.addNewsItem(item);
  110. }
  111. }
  112. }
  113. classPaginationAdapterextendsBaseAdapter{
  114. List<News>newsItems;
  115. publicPaginationAdapter(List<News>newsitems){
  116. this.newsItems=newsitems;
  117. }
  118. @Override
  119. publicintgetCount(){
  120. returnnewsItems.size();
  121. }
  122. @Override
  123. publicObjectgetItem(intposition){
  124. returnnewsItems.get(position);
  125. }
  126. @Override
  127. publiclonggetItemId(intposition){
  128. returnposition;
  129. }
  130. @Override
  131. publicViewgetView(intposition,Viewview,ViewGroupparent){
  132. if(view==null){
  133. view=getLayoutInflater().inflate(R.layout.list_item,null);
  134. }
  135. //新闻标题
  136. TextViewtvTitle=(TextView)view.findViewById(R.id.newstitle);
  137. tvTitle.setText(newsItems.get(position).getTitle());
  138. //新闻内容
  139. TextViewtvContent=(TextView)view.findViewById(R.id.newscontent);
  140. tvContent.setText(newsItems.get(position).getContent());
  141. returnview;
  142. }
  143. /**
  144. *添加数据列表项
  145. *@paramnewsitem
  146. */
  147. publicvoidaddNewsItem(Newsnewsitem){
  148. newsItems.add(newsitem);
  149. }
  150. }
  151. }

最后,运行程序的结果截图如下:


通过上面的截图,当我们点击"查看更多..."按钮时,就会加载下10条记录,当加载完所有的记录后,ListView的底部视图将会移除。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics