转载请注明出处
最近写的安卓程序当中有需要下拉刷新的地方,但是感觉自己写个ListView太烦,而且不是很懂,所以就在网上找到了PullToRefresh这个开源库;其实一开始也不会用,毕竟还只是小白一只,所以就一直在网上找各种的解决办法,看了几篇文章了之后觉得这个用起来其实不难,然后就很happy的向代码中添加了,结果发现用起来其实并没有那么简单,由于这个项目是自己做的,所以客户端和服务器端都要自己写,一开始遇到的问题就是下拉刷新的时候数据重复的问题,然后就是下拉刷新的时候更新的数据显示到最后的问题;下面我来详细说一下这几个问题;
要使用PullToRefresh当然首先要引进库文件了;网上有很多方法无论是Eclipse还是Android Studio,我在这里就不赘述了;
接下来就是要把ListView换成PullToRefreshListView代码如下
<span style="font-size:18px;"> <com.handmark.pulltorefresh.library.PullToRefreshListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
</com.handmark.pulltorefresh.library.PullToRefreshListView></span>
然后当然是在activity中绑定控件了
<span style="font-size:18px;">private PullToRefreshListView mListView;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
mListView = (PullToRefreshListView) mView.findViewById(R.id.consult_qanda_listview);
}
</span>
接着就是使用mListView
由于我要同时使用下拉刷新和上拉加载,所以模式我选择了BOTH(关于模式问题,其他博主有很多讲解的,可以去看看)
<span style="font-size:18px;">mListView.setMode(Mode.BOTH);
// 设置刷新监听
mListView.setOnRefreshListener(new OnRefreshListener<ListView>() {
@Override
public void onRefresh(PullToRefreshBase<ListView> refreshView) {
String str = DateUtils.formatDateTime(getActivity(),
System.currentTimeMillis(), DateUtils.FORMAT_SHOW_TIME
| DateUtils.FORMAT_SHOW_DATE
| DateUtils.FORMAT_ABBREV_ALL);
// 下拉刷新 业务代码
if (refreshView.isShownHeader()) {
mListView.getLoadingLayoutProxy(true, false).setPullLabel(
"下拉刷新");
mListView.getLoadingLayoutProxy(true, false)
.setRefreshingLabel("正在刷新");
mListView.getLoadingLayoutProxy(true, false)
.setReleaseLabel("释放开始加载");
refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(
"最后更新时间:" + str);
// 加载数据操作
URL = "http://192.168.1.104:8080/List?currentPage=0&id=" //这里是服务器的地址
+ lastId;
isPullToRefresh = true;
new ConsultListAsyncTask().execute(URL); //执行异步操作
}
// 上拉加载更多 业务代码
if (refreshView.isShownFooter()) {
mListView.getLoadingLayoutProxy(false, true).setPullLabel(
"上拉加载更多");
mListView.getLoadingLayoutProxy(false, true)
.setRefreshingLabel("正在加载");
mListView.getLoadingLayoutProxy(false, true)
.setReleaseLabel("释放开始加载");
refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(
"最后加载时间:" + str);
// 加载数据操作
currentPage++;
isPullToRefresh = false;
URL = "http://192.168.1.104:8080/List?currentPage="
+ currentPage + "&id=0";
new ConsultListAsyncTask().execute(URL);
}
}
});</span>
这里通过修改PullToRefresh的源码实现了下拉刷新和上拉加载的操作,在此感谢PuddingGuo提供的代码
文章地址http://blog.csdn.net/u012573920/article/details/44152749大家可以去看看;
然后我们在下拉刷新和上拉加载中分别实现了两个异步操作,异步操作采用了Get方式因此需要在URL中传参数;解释一下这两个参数是什么意思;第一个currentPage是表示当前的页数,主要用于加载更多里面,可以控制一次加载的数据量;第二个id是专门为下拉刷新准备的,因为之前有个问题是下拉刷新的时候会出现重复的数据,所以就给服务器传个id让服务器只给客户端传比这个id大的数据,这样下拉刷新就不会出现重复的数据了;
以上为客户端的代码
我们看看服务器的代码怎么写;经过上面的分析,我们只要每次传给客户端固定条数的数据然后根据客户端需要的页数返回相应的值就可以了;
<span style="font-size:18px;">String sql = "SELECT * FROM test WHERE id > " + ID; //只能获取到比id大的数据
ResultSet rs = new MyQuery().query(sql);
try {
rs.last(); //让rs的指针移到最后
int rowCount = rs.getRow(); //获取总数据量
Item = rowCount - CurrentPage * 5; //设置每次返回值的上限
Count = Item - 5; //设置每次返回值的下线和条数 5表示的是每次返回5条数据
rs.beforeFirst(); //把rs移到开头
while (rs.next()) {
length++;
int i = 0;
if (Count<length && length <= Item) {
//添加json数据
jsonArray.add(i, jsonObj);
i++;
}
}
PrintWriter out = response.getWriter();
out.print(jsonArray);</span>
这样每次返回5条数据,然后根据客户端的请求返回相应的值;
这样下拉刷新的时候出现重复的问题就解决了;
至于每次更新的数据都在最后的问题,其实很好解决,只要在添加数据的时候使用
<span style="font-size:18px;">mDatas.add(0, datas);</span>
就可以解决
至此下拉刷新和上拉加载已经可以正常使用;由于博主还是一只小小白,所以以上有什么东西讲的不对的欢迎各位拍砖讨论。