pulltorefresh的導入
首先,點擊new按鈕 -> import module
然后在 new module界面選擇已經在本地的含有源代碼的pulltorefresh。
打開如下圖所示的open module settings 按鈕
點擊app中的dependencies 中右邊框的"+"按鈕,選擇第三個 ,如下所示
選擇modules : pulltorefreshlibrary ,點擊ok
然后在build.gradle(module:app)或者你自己要寫的那個android 程序的根文件夾的build.gradle中加入下面一句話
compile project(':pulltorefreshlibrary')
自此,pulltorefresh已經導入成功,可以新建一個pulltorefrenshlistview驗證一下。
pulltorefreshlistview的基本使用
pulltorefreshlistview和listview的使用基本差的不多,只不過listview的xml要換成
com.handmark.pulltorefresh.library.pulltorefreshlistview
例子如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<?xml version= "1.0" encoding= "utf-8" ?> <linearlayout xmlns:android= "http://schemas.android.com/apk/res/android" android:layout_width= "match_parent" android:layout_height= "match_parent" android:orientation= "vertical" > <com.handmark.pulltorefresh.library.pulltorefreshlistview xmlns:ptr= "http://schemas.android.com/apk/res-auto" android:layout_height= "match_parent" android:layout_width= "match_parent" android:id= "@+id/refresh_list_view" ptr:ptrdrawable= "@drawable/default_ptr_flip" ptr:ptranimationstyle= "flip" ptr:ptrheaderbackground= "#383838" ptr:ptrheadertextcolor= "#ffffff" > </com.handmark.pulltorefresh.library.pulltorefreshlistview> </linearlayout> |
上面的例子中pulltorefreshlistview中多了幾個屬性 分別以ptr開頭,這是指定pulltorefreshlistview在刷新的時候出現的特效,比如第一個是指定刷新時顯示的圖片,第二個是指定刷新的圖片以何種方式顯示出來,第三個是指定刷新時頭部的背景,第四個是指定刷新時頭部字體的顏色。
以上這些都可以在代碼中設置。
listview中每個item的xml還是不變的,adapter的使用和寫法也是不變的,需要改變的只有設定刷新事件。
接下來在代碼中設定pulltorefreshlistview的一些基本屬性和事件。
步驟一 綁定控件,設置屬性
綁定控件代碼如下:
1
2
|
private pulltorefreshlistview listview; listview = (pulltorefreshlistview) findviewbyid(r.id.refresh_list_view); |
設置刷新時顯示的刷新狀態
1
2
3
4
5
6
7
8
9
10
11
12
|
//對pulltolistview綁定adapter listview.setadapter(adapter); /*設置pulltorefreshlistview的刷新模式,both代表支持上拉和下拉,pull_from_end代表上拉,pull_from_start代表下拉 */ listview.setmode(pulltorefreshbase.mode.both); initrefreshlistview(); initrefreshlistview方法設置刷新顯示的狀態 public void initrefreshlistview() { iloadinglayout labels = listview.getloadinglayoutproxy( true , true ); labels.setpulllabel( "快點拉" ); labels.setrefreshinglabel( "正在拉" ); labels.setreleaselabel( "放開刷新" ); } |
這里通過getloadinglayoutproxy 方法來指定上拉和下拉時顯示的狀態的區別,第一個true 代表下來狀態 ,第二個true 代表上拉的狀態 。如果想區分上拉和下拉狀態的不同,可以分別設置getloadinglayoutproxy ,例子如下:
1
2
3
4
5
6
7
8
9
10
11
|
public void initrefreshlistview(){ iloadinglayout startlabels = pulltorefresh .getloadinglayoutproxy( true , false ); startlabels.setpulllabel( "下拉刷新" ); startlabels.setrefreshinglabel( "正在拉" ); startlabels.setreleaselabel( "放開刷新" ); iloadinglayout endlabels = pulltorefresh.getloadinglayoutproxy( false , true ); endlabels.setpulllabel( "上拉刷新" ); endlabels.setrefreshinglabel( "正在載入..." ); endlabels.setreleaselabel( "放開刷新..." ); |
這樣pulltorefreshlistview刷新時狀態就設定好了。
步驟二 pulltorefreshlistview監聽事件的設置
這里主要設置setonrefreshlistener 事件,根據剛才設置的不同的刷新模式,在里面寫的匿名內部類也不一樣。
規則如下:
如果mode設置成mode.both,需要設置刷新listener為onrefreshlistener2,并實現onpulldowntorefresh()、onpulluptorefresh()兩個方法。
如果mode設置成mode.pull_from_start或mode.pull_from_end,需要設置刷新listener為onrefreshlistener,同時實現onrefresh()方法。
當然也可以設置為onrefreshlistener2,但是mode.pull_from_start的時候只調用onpulldowntorefresh()方法,mode.pull_from_end的時候只調用onpulluptorefresh()方法.
這樣在進入該activity時候,手動上拉和下拉就會實現刷新和加載。
如果想剛進入activity的時候就執行加載,則要調用如下方法
listview.setrefreshing();
接下來只需要在onpulldowntorefresh和onpulluptorefresh 編寫要獲取listview新數據的方法。
我這里的例子如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
listview.setonrefreshlistener( new pulltorefreshbase.onrefreshlistener2<listview>() { @override public void onpulldowntorefresh(pulltorefreshbase<listview> refreshview) { adapter.addtotop(); new finishrefresh().execute(); } @override public void onpulluptorefresh(pulltorefreshbase<listview> refreshview) { adapter.addtobottom(); new finishrefresh().execute(); } }); |
我這里在自定義的adapter中寫了2個新方法 addtotop 和addtobottom 分別在頭部加入數據和在尾部加入數據
方法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
private void addtotop() { for ( int i = 0 ; i < 2 ; i++) { item item = new item(); item.settext( "在頭部加入第" + i + "數據" ); item.setimageid(r.mipmap.ic_launcher); listitems.add(i, item); } } private void addtobottom() { for ( int i = 0 ; i < 2 ; i++) { item item = new item(); item.settext( "在尾部加入第" + i + "數據" ); item.setimageid(r.mipmap.ic_launcher); listitems.add(item); } } |
這里并沒有考慮去重的問題,就是每次刷新結束后會顯示出刷新的結果,當再次刷新后,又會執行和上次一樣的結果,實際上,這是不符合邏輯的,當第二次在刷新的時候應該進行判斷,如果數據一樣就不把數據加入到list當中。
接下來 new finishrefresh().execute(); 是這里我比較疑惑的一個固定寫法,在這個com.handmark.pulltorefresh.library.pulltorefreshlistview 框架下,執行onrefreshcomplete();方法必須在異步下執行,不能和主進程一起執行,如果直接在下拉,上拉監聽方法中寫入onrefreshcomplete(); 則在實際刷新中刷新狀態的顯示header是不會收回去的,換句話說 刷新一直不會完成。
所以要在繼承asynctask的類下調用onrefreshcomplete();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
private class finishrefresh extends asynctask< void , void , void > { @override protected void doinbackground( void ... params) { try { thread.sleep( 1000 ); } catch (interruptedexception e) { } return null ; } @override protected void onpostexecute( void avoid) { listview.onrefreshcomplete(); adapter.notifydatasetchanged(); } } |
至此,pulltorefreshlistview就實現了簡單的上拉,下拉使用
步驟三 pulltorefreslistview 的其他監聽方法
關于步驟三今天時間有限,先給大家分享到這里,后續持續更新。