<p>对于ListView分页加载数据,是正常情况下是非常有必要。一般对于少量的数据一次性把全部数据加载到ListView中显示,对于数据量多比较大,特别在资源有限的手机设备中更有重要,由用户去点击加载想要数据更为合适。在一些博客上看到关于ListView分页加载,但不太全面,实用性不高,因此我模拟正常情况下ListView分页加载,对于有方面帮助的朋友肯定有用,由于本人技术有限,可能存在些问题,欢迎指正,谢谢!</p><p>1. 先看效果吧,<br/></p><p><img src="/up_pic/201812/140439219780.png" title="140439219780.png"/></p><p><img src="/up_pic/201812/140439212995.png" title="140439212995.png"/></p><p><img src="/up_pic/201812/140439212865.png" title="140439212865.png"/></p><p><img src="/up_pic/201812/140439219258.png" title="140439219258.png"/></p><p><img src="/up_pic/201812/140439218911.png" title="140439218911.png"/></p><p>2. java代码:MainActivity.java</p><pre class="brush:java;toolbar:false">/**
*ListView分页加载数据
*@authorzhangkai281
*
*/
publicclassMainActivityextendsActivity{
privateListViewlistView;
privateList<Map<String,Object>>data;
privatelistViewAdapteradapter;
//分页加载的数据的数量
privateintpageSize=10;
privatefinalintpageType=1;
//查看更多
privateTextViewmoreTextView;
//正在加载进度条
privateLinearLayoutloadProgressBar;
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.list_page);
listView=(ListView)findViewById(R.id.lv_id);
//第一个参数:1起始数第二个参数:显示的数目
data=InitValue.initValue(1,15);
//在ListView中添加"加载更多"
addPageMore();
//添加"加载更多"一定要在设置Adapter之前
adapter=newlistViewAdapter();
listView.setAdapter(adapter);
}
privateclasslistViewAdapterextendsBaseAdapter{
intcount=data.size();
@Override
publicintgetCount(){
returncount;
}
@Override
publicObjectgetItem(intposition){
returnposition;
}
@Override
publiclonggetItemId(intposition){
returnposition;
}
@Override
publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
Viewview=LayoutInflater.from(MainActivity.this).inflate(R.layout.list_page_item,null);
TextViewtitle=(TextView)view.findViewById(R.id.tv_id);
TextViewtext=(TextView)view.findViewById(R.id.title_id);
title.setText(data.get(position).get("title").toString());
text.setText(data.get(position).get("text").toString());
returnview;
}
}
/**
*加载下一页的数据
*@parampageStart
*@parampageSize
*/
privatevoidchageListView(intpageStart,intpageSize){
List<Map<String,Object>>data=InitValue.initValue(pageStart,pageSize);
for(Map<String,Object>map:data){
this.data.add(map);
}
data=null;
}
/**
*在ListView中添加"加载更多"
*/
privatevoidaddPageMore(){
Viewview=LayoutInflater.from(this).inflate(R.layout.list_page_load,null);
moreTextView=(TextView)view.findViewById(R.id.more_id);
loadProgressBar=(LinearLayout)view.findViewById(R.id.load_id);
moreTextView.setOnClickListener(newButton.OnClickListener(){
@Override
publicvoidonClick(Viewv){
//隐藏"加载更多"
moreTextView.setVisibility(View.GONE);
//显示进度条
loadProgressBar.setVisibility(View.VISIBLE);
newThread(newRunnable(){
@Override
publicvoidrun(){
//休眠3秒,用于模拟网络操作时间
try{
Thread.sleep(3000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
//加载模拟数据:下一页数据,在正常情况下,上面的休眠是不需要,直接使用下面这句代码加载相关数据
chageListView(data.size(),pageSize);
Messagemes=handler.obtainMessage(pageType);
handler.sendMessage(mes);
}
}).start();
}
});
listView.addFooterView(view);
}
privateHandlerhandler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
switch(msg.what){
casepageType:
//改变适配器的数目
adapter.count+=pageSize;
//通知适配器,发现改变操作
adapter.notifyDataSetChanged();
//再次显示"加载更多"
moreTextView.setVisibility(View.VISIBLE);
//再次隐藏"进度条"
loadProgressBar.setVisibility(View.GONE);
break;
default:
break;
}
super.handleMessage(msg);
}
};
}</pre><p>3. 模拟数据,通常是通过网络取得服务器的数据,显示出来,得向服务传递参数包括分页相关,当时启起行数,每页显示多行数据。也可以加载本地的SQLite库中的数据。加载网络的比较比吧,以下只是模拟数据:</p><pre class="brush:java;toolbar:false">publicclassInitValue{
publicstaticintpage=1;
/**
*模拟数据分页加载,
*@parampageStart起始数
*@parampageSize每页显示数目
*@return
*/
publicstaticList<Map<String,Object>>initValue(intpageStart,intpageSize){
Map<String,Object>map;
List<Map<String,Object>>list=newArrayList<Map<String,Object>>();
for(inti=0;i<pageSize;i++){
map=newHashMap<String,Object>();
map.put("text","zhangkai281发表文章");
map.put("title",page+"_ListView分页显示");
++page;
list.add(map);
}
returnlist;
}
}</pre><p>4. 布局文件:main.xml:</p><pre class="brush:xml;toolbar:false"><?xmlversion="1.0"encoding="utf-8"?>
<ScrollViewandroid:layout_width="fill_parent"xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"android:scrollbars="vertical">
<LinearLayoutandroid:orientation="vertical"android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextViewandroid:layout_width="fill_parent"
android:layout_height="wrap_content"android:text="@string/app_name"/>
<ViewFlipperandroid:id="@+id/vf_id"android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
</ScrollView></pre><p>5. 布局文件:list_page.xml:</p><pre class="brush:java;toolbar:false"><?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">
<ListViewandroid:id="@+id/lv_id"android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
</LinearLayout></pre><p>6. 布局文件:list_page_load.xml</p><pre class="brush:java;toolbar:false"><?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"android:layout_height="fill_parent"
android:orientation="vertical"android:gravity="center_horizontal"
android:paddingTop="13dp"android:paddingBottom="13dp">
<TextViewandroid:id="@+id/more_id"android:layout_width="fill_parent"
android:layout_height="wrap_content"android:text="查看更多..."
android:textSize="25dp"android:gravity="center_horizontal"/>
<LinearLayoutandroid:id="@+id/load_id"android:orientation="horizontal"
android:layout_width="wrap_content"android:layout_height="wrap_content"
android:visibility="gone">
<ProgressBarandroid:layout_width="match_parent"android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"/>
<TextViewandroid:layout_width="wrap_content"android:layout_height="fill_parent"
android:gravity="center_vertical"android:layout_marginLeft="10dp"
android:text="正在加载..."android:textSize="20dp"/>
</LinearLayout>
</LinearLayout></pre><p>7. 还有此小xml加有列出,比较简单,此处省略,</p>