個人博客:haichenyi.com丹泉。感謝關(guān)注
簡介
Android里面刷新和分頁加載是常見的,刷新有Google的SwipeRefreshLayout鸭蛙,但是UI不同意摹恨,非要跟IOS一樣,那就沒辦法了娶视。
開源框架鏈接:Ultra-Pull-To-Refresh-With-Load-More晒哄。這個開源框架是基于Ultra-Pull-To-Refresh拓展了一個上拉加載功能。
作者:廖祜秋
依賴
implementation 'in.srain.cube:ptr-load-more:1.0.6'
用法
整個項目就只有一個核心類:PtrFrameLayout肪获,繼承ViewGroup寝凌。步驟:
xml里面定義控件PtrFrameLayout
設(shè)置相關(guān)屬性
添加Header,F(xiàn)ooter孝赫,并監(jiān)聽
監(jiān)聽刷新過程
第一步:xml里面定義控件PtrFrameLayout
<?xml version="1.0" encoding="utf-8"?>
<in.srain.cube.views.ptr.PtrFrameLayout
android:id="@+id/ptr_frame_layout"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:cube_ptr="http://schemas.android.com/apk/res-auto"
cube_ptr:ptr_resistance_header="1.7"
cube_ptr:ptr_ratio_of_header_height_to_refresh="1.2"
cube_ptr:ptr_duration_to_back_header="300"
cube_ptr:ptr_duration_to_close_header="2000"
cube_ptr:ptr_keep_header_when_refresh="true"
cube_ptr:ptr_pull_to_fresh="false"
cube_ptr:ptr_resistance_footer="1.3"
cube_ptr:ptr_duration_to_back_footer="300"
cube_ptr:ptr_duration_to_close_footer="2000">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorAccent"
android:gravity="center"
android:text="textView"/>
</LinearLayout>
</in.srain.cube.views.ptr.PtrFrameLayout>
上面就是一個簡單的布局较木,根布局是 PtrFrameLayout ,他的子View可以是任意view青柄。
第二步:設(shè)置相關(guān)屬性
我們也看到了伐债,他的布局里面有一些自定義屬性,可以在布局里面設(shè)置致开,也可以在java代碼里面設(shè)置峰锁,相關(guān)屬性含義如下:
Resistence:阻尼系數(shù),可以分別設(shè)置header和footer双戳。默認(rèn): 1.7f虹蒋,越大,感覺下拉刷新時越吃力飒货。上拉加載也是一樣的
Ratio of the Height of the Header to Refresh:觸發(fā)刷新時移動的位置比例魄衅。
默認(rèn),1.2f塘辅,移動達(dá)到頭部高度1.2倍時可觸發(fā)刷新操作晃虫。下拉刷新,上拉加載都一樣莫辨。Duration to Close back:回彈延時。默認(rèn) 200ms毅访,回彈到刷新或者高度所用時間沮榜,可以跟上面一樣分開設(shè)置,也可以設(shè)置一個
Duration to Close Header:刷新完成之后隱藏頭部的時間喻粹。默認(rèn)1000mscube_ptr:ptr_duration_to_close_either="2000"
Keep Header while Refreshing:刷新是保持頭部蟆融,也就是顯示頭部。默認(rèn)值 true守呜。false:隱藏頭部
Pull to Refresh / Release to Refresh:下拉刷新 / 釋放刷新型酥。
默認(rèn)為釋放的時候刷新
在java代碼中設(shè)置方式如下:
final PtrFrameLayout ptrFrameLayout = findViewById(R.id.ptr_frame_layout);
//配置頭部參數(shù),可以在xml中設(shè)置
// the following are default settings
ptrFrameLayout.setResistance(1.7f);
ptrFrameLayout.setRatioOfHeaderHeightToRefresh(1.2f);
ptrFrameLayout.setDurationToClose(200);
ptrFrameLayout.setDurationToCloseHeader(1000);
// default is false
ptrFrameLayout.setPullToRefresh(false);
// default is true
ptrFrameLayout.setKeepHeaderWhenRefresh(true);
第三步:添加Header山憨,F(xiàn)ooter,并監(jiān)聽
//第一種頭部,StoreHouse風(fēng)格的頭部實(shí)現(xiàn)
/*StoreHouseHeader storeHouseHeader = new StoreHouseHeader(this);
storeHouseHeader.setPadding(0,100,0,0);
storeHouseHeader.setBackgroundColor(Color.BLACK);
storeHouseHeader.setTextColor(Color.WHITE);
storeHouseHeader.initWithString("haichenyi");//只可英文弥喉,中文不可運(yùn)行(添加時間)
ptrFrameLayout.setHeaderView(storeHouseHeader);
ptrFrameLayout.addPtrUIHandler(storeHouseHeader);*/
//第二種頭部,Material Design風(fēng)格的頭部實(shí)現(xiàn),類似SwipeRefreshLayout
/*MaterialHeader materialHeader = new MaterialHeader(this);
materialHeader.setColorSchemeColors(new int[]{Color.RED, Color.GREEN, Color.BLUE});
ptrFrameLayout.setHeaderView(materialHeader);
ptrFrameLayout.addPtrUIHandler(materialHeader);*/
//第三種頭部,經(jīng)典 風(fēng)格的頭部實(shí)現(xiàn)郁竟,下拉箭頭+時間
PtrClassicDefaultHeader ptrClassicDefaultHeader = new PtrClassicDefaultHeader(this);
ptrFrameLayout.setHeaderView(ptrClassicDefaultHeader);
PtrClassicDefaultFooter ptrClassicDefaultFooter = new PtrClassicDefaultFooter(this);
ptrFrameLayout.setFooterView(ptrClassicDefaultFooter);
ptrFrameLayout.addPtrUIHandler(ptrClassicDefaultHeader);
ptrFrameLayout.addPtrUIHandler(ptrClassicDefaultFooter);
如上面代碼所示,Header由境,F(xiàn)ooter的種類是一樣的棚亩,Header有三種,F(xiàn)ooter也有三種虏杰,定義好之后讥蟆,通過 setHeaderView(), setFooterView() 添加到 ptrFrameLayout 中,然后通過調(diào)用 addPtrUIHandler 監(jiān)聽兩者的狀態(tài)即可纺阔。不監(jiān)聽會顯示空白瘸彤,看不到具體內(nèi)容
第四步:監(jiān)聽刷新過程
ptrFrameLayout.setPtrHandler(new PtrDefaultHandler2() {
@Override
public void onLoadMoreBegin(PtrFrameLayout frame) {
frame.postDelayed(ptrFrameLayout::refreshComplete, 2000);
}
@Override
public void onRefreshBegin(PtrFrameLayout frame) {
frame.postDelayed(ptrFrameLayout::refreshComplete, 2000);
}
});
ptrFrameLayout.setMode(PtrFrameLayout.Mode.LOAD_MORE);
通過設(shè)置 setPtrHandler() 方法監(jiān)聽刷新過程。默認(rèn)的是 PtrDefaultHandler2(),它是后來加的笛钝,包括刷新和加載质况。PtrDefaultHandler() 只包含刷新功能。通過setMode()方法設(shè)置:只要下拉刷新婆翔,或者只要上拉加載拯杠,或者兩者都要。