android 上拉刷新下拉加載更多的開源框架 XRefreshView
項目地址:[https://github.com/huxq17/XRefreshView][6],對比了網上流行的開源項目,個人認爲:
- XRefreshView 擴展性高。
- 可自定義Footers,上拉樣式,完全可以自己自定義想要的交互效果和樣式
- 可自定義Headers 下拉樣式,完全可以自己自定義想要的交互效果和樣式
- 支持所有的控件 ,RecyclerView,listview,gridview,LinearLayout,WebView等
- 可控性強
- 性能高,沒有明顯的重繪
- 作者熱情,如果遇到什麼問題。第一時間找他,他會第一時間幫你解答。沒有架子
快捷鍵
- 我與 XRefreshView 相遇
- 設置自定義樣式HeadersView
- 設置自定義樣式FooterView
- 下拉Headers 沒有什麼,下面講講作者提供Footer樣式吧
- RecyclerView與其他View(ListView GridView LinearLayout……….)設置自定義下拉上拉樣式View不同之處
- XRefreshView 屬性
- 佈局中注意的地方。如果你的整個列表不是全屏的。可能有title有底部導航時
- 鳴謝
我與 XRefreshView 相遇
其實,在android 行業大軍中,能自己去實現手勢控件的很少。大多數都是使用開源的項目。能寫出開源項目使用的人。技術水平肯定不一般。我個人自認爲達不到這樣的水平去實現這麼複雜的效果。去年,進了新公司。開始新的編程之路。項目前期準備,在xUtils 4羣裏問他們,上拉下拉使用的是那個框架。剛好作者也在,發了個鏈接 —— [ https://github.com/huxq17/XRefreshView ] 說:要不你去看看這個吧。我進去一看。效果正是我想要的。使用到現在一年多時間了。現在纔出來說說這個項目。
這裏不寫demo 例子,因爲作者的項目裏例子已經很詳情,下面講講要注意的地方。
例子請參考[https://github.com/huxq17/XRefreshView][2].
設置自定義樣式HeadersView
上拉 自定義Headers,需要實現IHeaderCallBack接口,例如:
public interface IHeaderCallBack {
/**
* 正常狀態
*/
public void onStateNormal();
/**
* 準備刷新
*/
public void onStateReady();
/**
* 正在刷新
*/
public void onStateRefreshing();
/**
* 刷新結束
*/
public void onStateFinish();
/**
* 獲取headerview顯示的高度與headerview高度的比例
*
* @param offset
* 移動距離和headerview高度的比例,範圍是0~1,0:headerview完全沒顯示 1:headerview完全顯示
* @param offsetY
* headerview移動的距離
*/
public void onHeaderMove(double offset, int offsetY,int deltaY);
/**
* 設置顯示上一次刷新的時間
*
* @param lastRefreshTime
* 上一次刷新的時間
*/
public void setRefreshTime(long lastRefreshTime);
/**
* 隱藏footerview
*/
public void hide();
/**
* 顯示footerview
*/
public void show();
/**
* 獲得headerview的高度,如果不想headerview全部被隱藏,就可以只返回一部分的高度
*
* @return
*/
public int getHeaderHeight();
}
看到上面的接口就知道自己如何處理各種下拉狀態了吧。根據上面的回調方法定義我們自己的UI
設置自定義樣式FooterView
上拉 自定義Footer,需要實現IFooterCallBack接口,例如:
public interface IFooterCallBack {
/**
* 當不是到達底部自動加載更多的時候,需要自己寫點擊事件
*
* @param xRefreshViewListener
*/
public void callWhenNotAutoLoadMore(XRefreshViewListener xRefreshViewListener);
/**
* 正常狀態,例如需要點擊footerview才能加載更多,主要是到達底部不自動加載更多時會被調用
*/
public void onStateReady();
/**
* 正在刷新
*/
public void onStateRefreshing();
/**
* 刷新結束 在此方法中不要調用show()方法
* @param hidefooter footerview是否被隱藏
*/
public void onStateFinish(boolean hidefooter);
/**
* 已無更多數據 在此方法中不要調用show()方法
*/
public void onStateComplete();
/**
* 設置顯示或者隱藏footerview 不要在onStateFinish和onStateComplete中調用此方法
* @param show
*/
public void show(boolean show);
/**
* footerview是否顯示中
*
* @return
*/
public boolean isShowing();
/**
* 獲得footerview的高度
*
* @return
*/
public int getFooterHeight();
}
看到上面的接口就知道自己如何處理上拉各種狀態了吧。根據上面的回調方法定義我們自己的UI
下拉Headers 沒有什麼,下面講講作者提供Footer樣式吧
XRefreshContentView
XRefreshViewFooter
XRefreshContentView 是支持 當數據不滿一屏時,不顯示上拉的Footer
XRefreshViewFooter 不同在於,當數據不滿一屏時,會顯示“點擊加載更多”
根據個人的項目需要去使用。
如果要自定義時,可以去參考作者的這兩個類。之前我向他提過一些比較無知的問。爲什麼這些功能不支持在XRefreshView裏直接提供。作者給出的回答是。這是兩種不同的概念。XRefreshView提供的只是功能。Footer樣式 只是UI展示。也許,這是開發的思維模式吧。要懂劃分功能邏輯與View的分離。
RecyclerView與其他View(ListView GridView LinearLayout……….)設置自定義下拉上拉樣式View不同之處
ListView GridView LinearLayout……….設置方式 使用
xrv.setCustomFooterView(new XRefreshViewFooter(this));
xrv.setCustomHeaderView(new XRefreshViewHeader(this));
RecyclerView 設置
Adapter 中必須要extends BaseRecyclerAdapter
因爲上拉加載完全後就不會整個列表回彈。直接顯示數據。
mAdapter.setCustomLoadMoreView(view) 來設置上拉樣式。
這就是RecyclerView與其他view 在設置上的不同。同時,你也可以像ListView GridView LinearLayout……….一樣設置。這是沒有影響了。只是上拉加載效果更多而已
XRefreshView 屬性
xrv.setPullRefreshEnable(false); 是否允許刷新功能
xrv.setPullLoadEnable(false); 是否允許加載更多功能
xrv.setAutoRefresh(true); 是否自動刷新
xrv.setAutoLoadMore(true);是否滑到底部自動加載更多,false 爲手動點加載更多。
xrv.setSlienceLoadMore();這個方法是設置預加載功能。預加載就是提前加載。這個只針對於上拉加載。與setPreLoadCount(5)一起用。設置5就是提示5個item 去啓動去請求網絡。
xrv.setPreLoadCount(5);設置預加載提前數量。以item 爲準
xrv.xrefreshView.setMoveForHorizontal(true);這個很通用,是用來處理手勢衝突的方法。比如你的列表加有橫向滑動的事件,記得設置一下這個屬性。讓你少了很多煩惱。
佈局中注意的地方。如果你的整個列表不是全屏的。可能有title有底部導航時
注意加上聲明
app:isHeightMatchParent=”false”
app:isWidthMatchParent=”false”
<com.andview.refreshview.XRefreshView
android:id="@+id/xrefreshview_View"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:isHeightMatchParent="false"
app:isWidthMatchParent="false">
<android.support.v7.widget.RecyclerView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</com.andview.refreshview.XRefreshView>
鳴謝
感謝作者。作者網名“無板替補” QQ我就不方便直接寫出來了。不過可以去[https://github.com/huxq17/XRefreshView][6]中有他的聯繫方式。如果在使用中遇到什麼問題,可以直接聯繫他。作者挺可愛的。也很熱心。
QQ羣:537610843 (加羣備註:XRefreshView)