前言
下拉刷新與上滑加載作為經(jīng)典的交互動(dòng)作沉眶,幾乎已經(jīng)成了各大App的標(biāo)配。Google也是在support包中加入了SwipeRefreshLayout, 一個(gè)符合MaterialDesign規(guī)范的下拉刷新布局逛腿。美中不足的是該布局不支持上滑加載更多。GitHub上面有不少直接擴(kuò)展ListView或者RecyclerView的例子,但我覺(jué)得刷新布局還是應(yīng)該作為內(nèi)容視圖的父控件兼搏,并且同時(shí)支持ListView和RecyclerView會(huì)更加方便泉粉。因此自己動(dòng)手寫(xiě)了一個(gè)輪子——RefreshLoadLayout连霉。
- 既支持上滑加載又支持下拉刷新
- 下拉刷新支持幾乎所有View,并且可以通過(guò)設(shè)置回調(diào)來(lái)判斷內(nèi)容視圖是否還能繼續(xù)上滑/下滑嗡靡。而上滑加載由于要考慮Fling跺撼,目前只做了AbsListView和RecyclerView的適配,相信已經(jīng)可以滿(mǎn)足絕大多數(shù)加載更多的需求讨彼。
- 支持NestedScrolling機(jī)制
使用介紹
添加 gralde 依賴(lài)
**compile 'com.github.refreshloadlayout:refreshloadlayout:0.0.4' **
如果收到支持庫(kù)不統(tǒng)一的警告歉井,可修改為 compile ('com.github.refreshloadlayout:refreshloadlayout:0.0.4'){exclude group: 'com.android.support'}在布局中使用
<com.github.refreshloadlayout.RefreshLoadLayout
android:id="@+id/refreshLayout"
app:loadingEnabled="true"
app:refreshingEnabled="true"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/listView"
android:background="#fff"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</com.github.refreshloadlayout.RefreshLoadLayout>下拉刷新
refreshLoadLayout.setOnRefreshListener(new RefreshLoadLayout.OnRefreshListener() {
@Override
public void onRefresh() {
refreshLoadLayout.postDelayed(new Runnable() {
@Override
public void run() {
refreshLoadLayout.endRefreshing();
}
}, 3000);
}
});
-
上滑加載
refreshLoadLayout.setLoadingHandler(new RefreshLoadLayout.LoadingHandler() { @Override public boolean canLoadMore() { return listView.getCount()<26; } @Override public void onLoading() { refreshLoadLayout.postDelayed(new Runnable() { @Override public void run() { ArrayAdapter<String> arrayAdapter= (ArrayAdapter<String>) listView.getAdapter(); arrayAdapter.add("a new data"); arrayAdapter.add("a new data"); refreshLoadLayout.endLoading(); } }, 2000); } });
其中 canLoadMore() 方法返回當(dāng)前是否可以進(jìn)行加載,即是否還有更多內(nèi)容哈误。
可設(shè)置是否需要在加載結(jié)束后將內(nèi)容視圖下滑一定距離,默認(rèn)開(kāi)啟:
refreshLoadLayout.setScrollDownAfterLoading(false);
啟用/關(guān)閉功能
默認(rèn)開(kāi)啟下拉刷新關(guān)閉上滑加載更多哩至,可以在xml中指定或者在代碼中修改。
refreshLoadLayout.setRefreshingEnabled(false);
refreshLoadLayout.setLoadingEnabled(true);
UI定制
目前共有兩種指示器顯示效果蜜自,默認(rèn)實(shí)現(xiàn)的是仿新浪微博的菩貌,還有一種是Material 效果。
首先可以通過(guò)refreshLoadLayout.getRefreshIndicator();
和refreshLoadLayout.getLoadMoreIndicator();
獲取當(dāng)前的指示器控件重荠。進(jìn)而對(duì)提示文字與背景顏色等調(diào)整菜谣。
同時(shí)支持?jǐn)U展 RefreshIndicator 和 LoadMoreIndicator 接口來(lái)打造自己的指示器,在相應(yīng)的回調(diào)中更新視圖達(dá)到理想的效果。之后可將指示器設(shè)置為自定義的View尾膊。
比如設(shè)置 Material 效果的指示器:
MaterialIndicator materialIndicator=new MaterialIndicator(this);
materialIndicator.getProgressView().setColorSchemeColors(Color.RED,Color.YELLOW);
refreshLoadLayout.setRefreshIndicator(materialIndicator);
總結(jié)
使用上總體還是比較簡(jiǎn)單的媳危,有需要的朋友可以添加到自己的項(xiàng)目中試試。項(xiàng)目已開(kāi)源至 GitHub, 有問(wèn)題歡迎提issue冈敛,我會(huì)盡快處理待笑。如果對(duì)你有幫助,還請(qǐng)右上角star :)