前言:前几天写了篇关于PullToRefresh控件的DEMO导入的博客,但由于当时没有用到,所以就没细往下讲,现在开始到了实战阶段,用到了PullToRefresh的listView样式,网上有讲的,但讲的不多,而且没有详细的例子来说,下面我讲讲这个东东的实现方法。这个例子对应PullToRefreshDemo里的第一个选项ListView;
注意:本篇仅写的如何实现下拉刷新,对于上拉加载的问题,参见《使用PullToRefresh实现下拉刷新和上拉加载》
效果图:
正在刷新 刷新后
一、导入Library
下载源码后(https://github.com/chrisbanes/Android-PullToRefresh),里面有个Library工程,添加工程到Eclipse中;
另外extras文件夹还有两个工程:PullToRefreshListFragment和PullToRefreshViewPager,由于我们的这个用不到他们的库文件,所以不必导入了;
二、实战
1、新建工程,添加Libray库到工程中
新建工程(try_PullToRefresh)后,右键-》Properties-》Android-》Add 选择上面的Library,然后就是这个样子的
2、重写activity_main.xml
XML内容为:
[代码]java代码:
01 | [html] view plaincopy在CODE上查看代码片派生到我的代码片 |
02 | <?xml version= "1.0" encoding= "utf-8" ?> |
03 | <LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android" |
04 | android:layout_width= "fill_parent" |
05 | android:layout_height= "fill_parent" |
06 | android:orientation= "vertical" > |
08 | <!-- The PullToRefreshListView replaces a standard ListView widget. --> |
09 | <com.handmark.pulltorefresh.library.PullToRefreshListView |
10 | android:id= "@+id/pull_refresh_list" |
11 | android:layout_width= "fill_parent" |
12 | android:layout_height= "fill_parent" |
13 | android:cacheColorHint= "#00000000" |
14 | android:divider= "#19000000" |
15 | android:dividerHeight= "4dp" |
16 | android:fadingEdge= "none" |
17 | android:fastScrollEnabled= "false" |
18 | android:footerDividersEnabled= "false" |
19 | android:headerDividersEnabled= "false" |
20 | android:smoothScrollbar= "true" /> |
其中中间那一大段<com.handmark.pull………………/>就是相当于ListView控件,用这段来代替原是ListView控件的代码
3、JAVA代码讲解
全部代码:
[代码]java代码:
01 | [java] view plaincopy在CODE上查看代码片派生到我的代码片 |
02 | package com.example.try_pulltorefresh; |
04 | import java.util.Arrays; |
05 | import java.util.LinkedList; |
07 | import com.handmark.pulltorefresh.library.PullToRefreshBase; |
08 | import com.handmark.pulltorefresh.library.PullToRefreshListView; |
09 | import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener; |
11 | import android.os.AsyncTask; |
12 | import android.os.Bundle; |
13 | import android.app.Activity; |
14 | import android.text.format.DateUtils; |
15 | import android.widget.ArrayAdapter; |
16 | import android.widget.ListView; |
18 | public class MainActivity extends Activity { |
19 | private String[] mStrings = { "Abbaye de Belloc" , "Abbaye du Mont des Cats" , "Abertam" , "Abondance" , "Ackawi" , |
20 | "Acorn" , "Adelost" , "Affidelice au Chablis" , "Afuega'l Pitu" , "Airag" , "Airedale" , "Aisy Cendre" , |
21 | "Allgauer Emmentaler" , "Abbaye de Belloc" , "Abbaye du Mont des Cats" , "Abertam" , "Abondance" , "Ackawi" , |
22 | "Acorn" , "Adelost" , "Affidelice au Chablis" , "Afuega'l Pitu" , "Airag" , "Airedale" , "Aisy Cendre" , |
23 | "Allgauer Emmentaler" }; |
24 | private LinkedList<String> mListItems; |
25 | private PullToRefreshListView mPullRefreshListView; |
26 | private ArrayAdapter<String> mAdapter; |
29 | protected void onCreate(Bundle savedInstanceState) { |
30 | super .onCreate(savedInstanceState); |
31 | setContentView(R.layout.activity_main); |
33 | mPullRefreshListView = (PullToRefreshListView) findViewById(R.id.pull_refresh_list); |
36 | mPullRefreshListView.setOnRefreshListener( new OnRefreshListener<ListView>() { |
38 | public void onRefresh(PullToRefreshBase<ListView> refreshView) { |
39 | String label = DateUtils.formatDateTime(getApplicationContext(), System.currentTimeMillis(), |
40 | DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL); |
43 | refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label); |
46 | new GetDataTask().execute(); |
50 | mListItems = new LinkedList<String>(); |
51 | mListItems.addAll(Arrays.asList(mStrings)); |
53 | mAdapter = new ArrayAdapter<String>( this , android.R.layout.simple_list_item_1, mListItems); |
59 | ListView actualListView = mPullRefreshListView.getRefreshableView(); |
60 | actualListView.setAdapter(mAdapter); |
63 | private class GetDataTask extends AsyncTask<Void, Void, String> { |
67 | protected String doInBackground(Void... params) { |
71 | } catch (InterruptedException e) { |
73 | String str= "Added after refresh...I add" ; |
80 | protected void onPostExecute(String result) { |
82 | mListItems.addFirst(result); |
85 | mAdapter.notifyDataSetChanged(); |
87 | mPullRefreshListView.onRefreshComplete(); |
89 | super .onPostExecute(result); |
代码讲解:
1、变量定义
- private LinkedList<String> mListItems; //显示的列表对应原字符串
- private PullToRefreshListView mPullRefreshListView; //PullToRefreshListView实例
- private ArrayAdapter<String> mAdapter; //ListView的适配器
2、在OnCreate()中主要分为两步
(1)初始化mPullRefreshListView并设置监听器,以执行当需要刷新时,应该怎么办,至于真正执行刷新的类GetDataTask()我们后面再细讲,对应代码为:
[代码]java代码:
01 | view plaincopy在CODE上查看代码片派生到我的代码片 |
02 | mPullRefreshListView = (PullToRefreshListView) findViewById(R.id.pull_refresh_list); |
05 | mPullRefreshListView.setOnRefreshListener( new OnRefreshListener<ListView>() { |
07 | public void onRefresh(PullToRefreshBase<ListView> refreshView) { |
08 | String label = DateUtils.formatDateTime(getApplicationContext(), System.currentTimeMillis(), |
09 | DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL); |
12 | refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label); |
15 | new GetDataTask().execute(); |
(2)设置适配器列表内容,并与ListView绑定以显示出来,对应代码为:
[代码]java代码:
01 | view plaincopy在CODE上查看代码片派生到我的代码片 |
03 | mListItems = new LinkedList<String>(); |
04 | mListItems.addAll(Arrays.asList(mStrings)); |
05 | mAdapter = new ArrayAdapter<String>( this , android.R.layout.simple_list_item_1, mListItems); |
11 | ListView actualListView = mPullRefreshListView.getRefreshableView(); |
12 | actualListView.setAdapter(mAdapter); |
3、执行刷新的类GetDataTask()
先贴出这段代码来:
[代码]java代码:
01 | view plaincopy在CODE上查看代码片派生到我的代码片 |
02 | private class GetDataTask extends AsyncTask<Void, Void, String> { |
05 | protected String doInBackground(Void... params) { |
09 | } catch (InterruptedException e) { |
11 | String str= "Added after refresh...I add" ; |
18 | protected void onPostExecute(String result) { |
20 | mListItems.addFirst(result); |
23 | mAdapter.notifyDataSetChanged(); |
25 | mPullRefreshListView.onRefreshComplete(); |
27 | super .onPostExecute(result); |
(1)派生自AsyncTask
由于派生自AsyncTask,所以下面的那个函数doInBackground和onPostExecute就不难理解了,这两个函数是AsyncTask必须是重写的两个函数
(2)doInBackground函数
doInBackground执行要于后台执行的语句,返回的值可以是任意类型,但要提前在extends AsyncTask<Void, Void, String> 中定义,这个返回值会做为onPostExecute的参数result传到onPostExecute函数中;如果对于网络访问程序,doInBackground就执行访问网络的代码,然后讲返回值存在result中传给onPostExecute函数,以刷新列表;
(3)onPostExecute函数
onPostExecute()是对返回的值进行操作,并添加到ListView的列表中,有两种添加方式添加到头部----mListItems.addFirst(result);和添加在尾部----mListItems.addLast(result);
至于 AsyncTask,下面是几个网页,讲的还可以,大家可以参考下:
《android AsyncTask 详解》:http://www.eoeandroid.com/thread-168004-1-1.html
《android AsyncTask 详解》(同名):http://blog.csdn.net/dabizime/article/details/6695705
《android之AsyncTask》:http://blog.csdn.net/singwhatiwanna/article/details/9272195
《Android源码分析--带你认识不一样的AsyncTask》:http://blog.csdn.net/singwhatiwanna/article/details/17596225 (绝对精品)
另外:
1、设置向上拉刷新还是向下拉刷新的代码:
mPullRefreshListView.setMode(Mode.PULL_FROM_END);//向下拉刷新
mPullRefreshListView.setMode(Mode.PULL_FROM_START);//向上拉刷新
mPullRefreshListView.setMode(Mode.BOTH);//两端刷新
注意:这只是一个精简版,在源码中还有一些可借签的代码,可以在看懂这个以后,可以回过头来再看看源码,我相信肯定会有收获的。
源码来啦:http://download.csdn.net/detail/harvic880925/6788247(不要分,仅供分享)