简介
Android系统支持的ListView只负责显示数据,不支持分页显示。而使其情况下列表需要展示的数据可能很多,如果一下子载全部加载完成,会导致效率的降低,甚至会导致内存溢出,因此我们必须实现分页功能。
功能
本文自定的listview支持列表滑到最后一条记录时加载下一页数据。
自定义ListView分页步骤
1 自定义PagerListView继承Android平台ListView,并实现OnScrollListener接口(此接口是列表视图滚动时的一个回调接口),重写或者实现响应的方法。
2 定义底部FView,xml或者代码中,也可以不需要
3 实现回调方法,在回调方法(onScroll)中记录最后一条记录位置和总条数,在回调方法(onScrollStateChanged)中判断是否滚动到最后一条记录,如果是则加载数据。
4 自定义数据加载接口,接受记录起始位置和每页记录数两个参数,此接口由使用者实现,由listview调用,以自动分页。
示例
示例中
AsyncNetRequest是自定义异步请求类,参见
Android异步请求处理实现机制
请求中URL为本地一个请求,可以是任何数据,此请求仅仅模拟远程请求,实际要展示的数据在请求成功后自动生成。
底部View定义
res/layout/pagerlistview_loadmore_footer.xml
<?xml version="1.0" encoding="utf-8"?>
<!-- ListView底部加载更多按钮 -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" android:padding="10dp">
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/gray" />
<!-- 正在加载 -->
<RelativeLayout
android:id="@+id/loader_loading"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="正在加载..."
android:textSize="18sp" />
</RelativeLayout>
<!-- 加载更多 -->
<RelativeLayout
android:id="@+id/loader_load"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:visibility="gone" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="点此加载更多"
android:textSize="18sp" />
</RelativeLayout>
<!-- 已显示全部 -->
<RelativeLayout
android:id="@+id/loader_none"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:visibility="gone" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="已显示全部"
android:textSize="18sp" />
</RelativeLayout>
</RelativeLayout>
<!-- ListView底部加载更多按钮 -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" android:padding="10dp">
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/gray" />
<!-- 正在加载 -->
<RelativeLayout
android:id="@+id/loader_loading"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="正在加载..."
android:textSize="18sp" />
</RelativeLayout>
<!-- 加载更多 -->
<RelativeLayout
android:id="@+id/loader_load"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:visibility="gone" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="点此加载更多"
android:textSize="18sp" />
</RelativeLayout>
<!-- 已显示全部 -->
<RelativeLayout
android:id="@+id/loader_none"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:visibility="gone" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="已显示全部"
android:textSize="18sp" />
</RelativeLayout>
</RelativeLayout>
PagerListView定义
import com.example.fxgandroid.R;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AbsListView;
import android.widget.ListView;
import android.widget.AbsListView.OnScrollListener;
/**
* 自定义ListView,添加分页支持。点击底部提示View或者滚动到底部时加载更多数据
*
* @author fengxiaogang
*
*/
public class PagerListView extends ListView implements OnScrollListener {
// 底部View,正在加载、加载更多、已显示全部数据
private View footerView;
private View loadingView;
private View loadView;
private View noneView;