Android实现ListView分页自动加载数据的方法

Android实现ListView分页自动加载数据的方法,第1张

概述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源码:

<span ><?xml version="1.0" enCoding="utf-8"?> <linearLayout  xmlns:androID="http://schemas.androID.com/apk/res/androID"  androID:layout_wIDth="fill_parent"  androID:layout_height="fill_parent"  androID:orIEntation="vertical">  <TextVIEw    androID:ID="@+ID/newsTitle"    androID:layout_wIDth="fill_parent"    androID:layout_height="wrap_content"/>  <TextVIEw    androID:ID="@+ID/newscontent"    androID:layout_wIDth="fill_parent"    androID:layout_height="wrap_content"/> </linearLayout></span> 

layout中loadmore.xml源码:

<?xml version="1.0" enCoding="utf-8"?> <linearLayout  xmlns:androID="http://schemas.androID.com/apk/res/androID"  androID:layout_wIDth="fill_parent"  androID:layout_height="fill_parent">  <button     androID:ID="@+ID/loadMorebutton"     androID:layout_wIDth="fill_parent"     androID:layout_height="wrap_content"    androID:text="查看更多..." />  </linearLayout> 

layout中main.xml源码:

<?xml version="1.0" enCoding="utf-8"?> <linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"   androID:orIEntation="vertical"   androID:layout_wIDth="fill_parent"   androID:layout_height="fill_parent">   <ListVIEw     androID:ID="@+ID/lvNews"     androID:layout_wIDth="fill_parent"     androID:layout_height="wrap_content"/> </linearLayou 

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

package com.andyIDea.bean; public class News {      private String Title;  //标题   private String content; //内容      public String getTitle() {     return Title;   }   public voID setTitle(String Title) {     this.Title = Title;   }   public String getContent() {     return content;   }   public voID setContent(String content) {     this.content = content;   }  } 

包com.andyIDea.ListvIEw中paginationListVIEwActivity.java类源码:

package com.andyIDea.ListvIEw;  import java.util.ArrayList; import java.util.List;  import com.andyIDea.bean.News;  import androID.app.Activity; import androID.os.Bundle; import androID.os.Handler; import androID.util.Log; import androID.vIEw.VIEw; import androID.vIEw.VIEwGroup; import androID.Widget.AbsListVIEw; import androID.Widget.AbsListVIEw.OnScrollListener; import androID.Widget.BaseAdapter; import androID.Widget.button; import androID.Widget.ListVIEw; import androID.Widget.TextVIEw; import androID.Widget.Toast;  public class PaginationListVIEwActivity extends Activity implements OnScrollListener {      private ListVIEw ListVIEw;    private int visibleLastIndex = 0;  //最后的可视项索引    private int visibleItemCount;    // 当前窗口可见项总数    private int datasize = 38;     //模拟数据集的条数   private PaginationAdapter adapter;    private VIEw loadMoreVIEw;    private button loadMorebutton;    private Handler handler = new Handler();       /** Called when the activity is first created. */   @OverrIDe   public voID onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentVIEw(R.layout.main);          loadMoreVIEw = getLayoutInflater().inflate(R.layout.loadmore,null);     loadMorebutton = (button)loadMoreVIEw.findVIEwByID(R.ID.loadMorebutton);     loadMorebutton.setonClickListener(new VIEw.OnClickListener() {              @OverrIDe       public voID onClick(VIEw v) {         loadMorebutton.setText("正在加载中...");  //设置按钮文字         handler.postDelayed(new Runnable() {                      @OverrIDe           public voID run() {             loadMoreData();             adapter.notifyDataSetChanged();             loadMorebutton.setText("查看更多..."); //恢复按钮文字           }         },2000);                }     });          ListVIEw = (ListVIEw)findVIEwByID(R.ID.lvNews);     ListVIEw.addFooterVIEw(loadMoreVIEw);  //设置列表底部视图     initializeAdapter();     ListVIEw.setAdapter(adapter);     ListVIEw.setonScrollListener(this);   }      @OverrIDe   public voID onScrollStateChanged(AbsListVIEw vIEw,int scrollState) {     int itemsLastIndex = adapter.getCount()-1; //数据集最后一项的索引      int lastIndex = itemsLastIndex + 1;     if (scrollState == OnScrollListener.SCRolL_STATE_IDLE         && visibleLastIndex == lastIndex) {       // 如果是自动加载,可以在这里放置异步加载数据的代码     }   }     @OverrIDe   public voID onScroll(AbsListVIEw vIEw,int firstVisibleItem,int visibleItemCount,int totalitemCount) {     this.visibleItemCount = visibleItemCount;     visibleLastIndex = firstVisibleItem + visibleItemCount - 1;          Log.e("========================= ","========================");     Log.e("firstVisibleItem = ",firstVisibleItem+"");     Log.e("visibleItemCount = ",visibleItemCount+"");     Log.e("totalitemCount = ",totalitemCount+"");     Log.e("========================= ","========================");          //如果所有的记录选项等于数据集的条数,则移除列表底部视图     if(totalitemCount == datasize+1){       ListVIEw.removeFooterVIEw(loadMoreVIEw);       Toast.makeText(this,"数据全部加载完!",Toast.LENGTH_LONG).show();     }   }      /**    * 初始化ListVIEw的适配器    */   private voID initializeAdapter(){     List<News> news = new ArrayList<News>();     for(int i=1;i<=10;i++){       News items = new News();       items.setTitle("Title"+i);       items.setContent("This is News Content"+i);       news.add(items);     }     adapter = new PaginationAdapter(news);   }      /**    * 加载更多数据    */   private voID loadMoreData(){     int count = adapter.getCount();          if(count+10 <= datasize){       for(int i=count+1; i<=count+10; i++){         News item = new News();         item.setTitle("Title"+i);         item.setContent("This is News Content"+i);         adapter.addNewsItem(item);       }     }else{       for(int i=count+1; i<=datasize; i++){         News item = new News();         item.setTitle("Title"+i);         item.setContent("This is News Content"+i);         adapter.addNewsItem(item);       }     }        }         class PaginationAdapter extends BaseAdapter{          List<News> newsItems;          public PaginationAdapter(List<News> newsitems){       this.newsItems = newsitems;     }      @OverrIDe     public int getCount() {       return newsItems.size();     }      @OverrIDe     public Object getItem(int position) {       return newsItems.get(position);     }      @OverrIDe     public long getItemID(int position) {       return position;     }      @OverrIDe     public VIEw getVIEw(int position,VIEw vIEw,VIEwGroup parent) {       if(vIEw == null){         vIEw = getLayoutInflater().inflate(R.layout.List_item,null);       }              //新闻标题       TextVIEw tvTitle = (TextVIEw)vIEw.findVIEwByID(R.ID.newsTitle);       tvTitle.setText(newsItems.get(position).getTitle());       //新闻内容       TextVIEw tvContent = (TextVIEw)vIEw.findVIEwByID(R.ID.newscontent);       tvContent.setText(newsItems.get(position).getContent());              return vIEw;     }          /**      * 添加数据列表项      * @param newsitem      */     public voID addNewsItem(News newsitem){       newsItems.add(newsitem);     }        }  } 

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

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

希望本文所述对大家学习AndroID软件编程有所帮助。

总结

以上是内存溢出为你收集整理的Android实现ListView分页自动加载数据的方法全部内容,希望文章能够帮你解决Android实现ListView分页自动加载数据的方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1142077.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存