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源码:
-
<spanstyle="font-size:13px;"><?xmlversion="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源码:
-
<?xmlversion="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源码:
-
<?xmlversion="1.0"encoding="utf-8"?>
-
<LinearLayoutxmlns: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类源码:
-
packagecom.andyidea.bean;
-
-
/**
-
*新闻实体类
-
*@authorAndy.Chen
-
*@mailChenjunjun.ZJ@gmail.com
-
*
-
*/
-
publicclassNews{
-
-
privateStringtitle;//标题
-
privateStringcontent;//内容
-
-
publicStringgetTitle(){
-
returntitle;
-
}
-
publicvoidsetTitle(Stringtitle){
-
this.title=title;
-
}
-
publicStringgetContent(){
-
returncontent;
-
}
-
publicvoidsetContent(Stringcontent){
-
this.content=content;
-
}
-
-
}
包com.andyidea.listview中paginationListViewActivity.java类源码:
-
packagecom.andyidea.listview;
-
-
importjava.util.ArrayList;
-
importjava.util.List;
-
-
importcom.andyidea.bean.News;
-
-
importandroid.app.Activity;
-
importandroid.os.Bundle;
-
importandroid.os.Handler;
-
importandroid.util.Log;
-
importandroid.view.View;
-
importandroid.view.ViewGroup;
-
importandroid.widget.AbsListView;
-
importandroid.widget.AbsListView.OnScrollListener;
-
importandroid.widget.BaseAdapter;
-
importandroid.widget.Button;
-
importandroid.widget.ListView;
-
importandroid.widget.TextView;
-
importandroid.widget.Toast;
-
-
publicclassPaginationListViewActivityextendsActivityimplementsOnScrollListener{
-
-
privateListViewlistView;
-
privateintvisibleLastIndex=0;//最后的可视项索引
-
privateintvisibleItemCount;//当前窗口可见项总数
-
privateintdatasize=38;//模拟数据集的条数
-
privatePaginationAdapteradapter;
-
privateViewloadMoreView;
-
privateButtonloadMoreButton;
-
privateHandlerhandler=newHandler();
-
-
/**Calledwhentheactivityisfirstcreated.*/
-
@Override
-
publicvoidonCreate(BundlesavedInstanceState){
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.main);
-
-
loadMoreView=getLayoutInflater().inflate(R.layout.loadmore,null);
-
loadMoreButton=(Button)loadMoreView.findViewById(R.id.loadMoreButton);
-
loadMoreButton.setOnClickListener(newView.OnClickListener(){
-
-
@Override
-
publicvoidonClick(Viewv){
-
loadMoreButton.setText("正在加载中...");//设置按钮文字
-
handler.postDelayed(newRunnable(){
-
-
@Override
-
publicvoidrun(){
-
loadMoreData();
-
adapter.notifyDataSetChanged();
-
loadMoreButton.setText("查看更多...");//恢复按钮文字
-
}
-
},2000);
-
-
}
-
});
-
-
listView=(ListView)findViewById(R.id.lvNews);
-
listView.addFooterView(loadMoreView);//设置列表底部视图
-
initializeAdapter();
-
listView.setAdapter(adapter);
-
listView.setOnScrollListener(this);
-
}
-
-
@Override
-
publicvoidonScrollStateChanged(AbsListViewview,intscrollState){
-
intitemsLastIndex=adapter.getCount()-1;//数据集最后一项的索引
-
intlastIndex=itemsLastIndex+1;
-
if(scrollState==OnScrollListener.SCROLL_STATE_IDLE
-
&&visibleLastIndex==lastIndex){
-
//如果是自动加载,可以在这里放置异步加载数据的代码
-
}
-
}
-
-
-
@Override
-
publicvoidonScroll(AbsListViewview,intfirstVisibleItem,
-
intvisibleItemCount,inttotalItemCount){
-
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的适配器
-
*/
-
privatevoidinitializeAdapter(){
-
List<News>news=newArrayList<News>();
-
for(inti=1;i<=10;i++){
-
Newsitems=newNews();
-
items.setTitle("Title"+i);
-
items.setContent("ThisisNewsContent"+i);
-
news.add(items);
-
}
-
adapter=newPaginationAdapter(news);
-
}
-
-
/**
-
*加载更多数据
-
*/
-
privatevoidloadMoreData(){
-
intcount=adapter.getCount();
-
-
if(count+10<=datasize){
-
for(inti=count+1;i<=count+10;i++){
-
Newsitem=newNews();
-
item.setTitle("Title"+i);
-
item.setContent("ThisisNewsContent"+i);
-
adapter.addNewsItem(item);
-
}
-
}else{
-
for(inti=count+1;i<=datasize;i++){
-
Newsitem=newNews();
-
item.setTitle("Title"+i);
-
item.setContent("ThisisNewsContent"+i);
-
adapter.addNewsItem(item);
-
}
-
}
-
-
}
-
-
-
classPaginationAdapterextendsBaseAdapter{
-
-
List<News>newsItems;
-
-
publicPaginationAdapter(List<News>newsitems){
-
this.newsItems=newsitems;
-
}
-
-
@Override
-
publicintgetCount(){
-
returnnewsItems.size();
-
}
-
-
@Override
-
publicObjectgetItem(intposition){
-
returnnewsItems.get(position);
-
}
-
-
@Override
-
publiclonggetItemId(intposition){
-
returnposition;
-
}
-
-
@Override
-
publicViewgetView(intposition,Viewview,ViewGroupparent){
-
if(view==null){
-
view=getLayoutInflater().inflate(R.layout.list_item,null);
-
}
-
-
//新闻标题
-
TextViewtvTitle=(TextView)view.findViewById(R.id.newstitle);
-
tvTitle.setText(newsItems.get(position).getTitle());
-
//新闻内容
-
TextViewtvContent=(TextView)view.findViewById(R.id.newscontent);
-
tvContent.setText(newsItems.get(position).getContent());
-
-
returnview;
-
}
-
-
/**
-
*添加数据列表项
-
*@paramnewsitem
-
*/
-
publicvoidaddNewsItem(Newsnewsitem){
-
newsItems.add(newsitem);
-
}
-
-
}
-
-
}
最后,运行程序的结果截图如下:
通过上面的截图,当我们点击"查看更多..."按钮时,就会加载下10条记录,当加载完所有的记录后,ListView的底部视图将会移除。
分享到:
相关推荐
新浪微博项目一直想实现listview分页加载数据
android下listview分页加载更多,绝对可用
当列表数据量大的时候我们一半都进行分页,android里分页一半不同于PC端,第几页的方式,一般都是滑动到底部数据自带加载,废话不多数了直接看代码:
android listView 分页加载
ListView动态加载数据分页,使用Handler+线程和AsyncTask两种方法
Android高级应用源码-Listview分页加载数据.zip
这是一个android listview分页查询显示的demo,使用sqlite数据库,然后每次显示10条,上拉加载更多数据,studio项目
android中listview数据分页加载功能实现
本篇文章主要介绍了Android中ListView分页加载数据功能实现,具有一定的参考价值,有需要的可以了解一下。
Android ListView分页功能源码
Android ListView分页加载功能 在实际开发中经常用到,是每个开发者必须掌握的内容,本Demo给出了服务端+Android端的两者的代码,并成功通过了测试。 服务端使用MyEclipse,Android端使用Eclipse。
安卓Android源码——Listview分页加载数据.zip
Android ListView 滑动分页 分页加载数据
Android 自定义ListView实现底部分页刷新与顶部下拉刷新 一.ListView 底部分页加载 整个底部分页加载,主要分一下几步: 1.加载底部自定义View; 2.响应OnScrollListener监听事件,onScroll方法记录最后可见的View ...
安卓Android源码——Listview分页加载数据.rar
Android中ListView分页加载数据
主要介绍了Android实现ListView分页自动加载数据的方法,涉及Android生成listview列表的相关技巧,需要的朋友可以参考下