轉載請注明出處:http://blog.csdn.net/footballclub/
XRefreshView更新說明
這段時間一直有朋友給我反饋,讓我幫忙解決這個問題,我匯總了下,有以下幾種:
1. 處理listview滑動刪除與XRefreshView的沖突
2. 處理viewpager和XRefreshView的沖突
3. listview滑動究竟部自己主動載入很多其它
4. 刷新時,不讓里面的listview上下滑動
5. 自己定義headerview和footerview
6. 配置自己定義頭部廣告位
除了廣告位的都已經完畢了。除此之外,我還對默認的header和footer做了ui上的優化,特別地,鑒於Recylerview的強大,我還針對Recylerview做了特別的適配,接下來先看效果圖。在模擬器上錄的。有點卡卡的。
效果圖
更新具體
1.處理橫向移動與XRefreshView的沖突
假設須要在手指橫向移動的時候。讓XRefreshView不攔截事件,
xRefreshView.setMoveForHorizontal(true);
能夠調用setMoveForHorizontal並傳入true就可以。
2.滑動究竟部自己主動載入很多其它
眼下僅僅做了Abslistview和Recylerview的
xRefreshView.setAutoLoadMore(false);
true會自己主動載入很多其它,false則相反。傳入false的話。假設是listview。須要上拉才干載入很多其它。假設是Recylerview。則會須要點擊才干載入很多其它。就像這樣
點擊載入很多其它涉及到自己定義footerview。到后面再說,這里先放着。
3.刷新時,不讓里面的列表上下滑動
假設刷新時不想讓里面的列表滑動。能夠這么設置
xRefreshView.setPinnedContent(true);
4.支持button點擊開始刷新
XRefreshView不僅支持手勢下拉刷新,也支持button點擊開始刷新。
xRefreshView.startRefresh();
能夠在activity的onResume()中調用。也能夠在button的點擊事件中調用。
5.設置Abslistview和Recylerview的滾動監聽事件
假設你有設置Abslistview和Recylerview滾動監聽事件的須要的話,就不能直接使用Abslistview和Recylerview的setOnScrollListener方法了。由於為了實現自己主動載入很多其它的功能。監聽已經被XRefreshView使用了,所以這時候須要使用XRefreshView提供的設置滾動監聽的方法
/** * 設置Abslistview的滾動監聽事件 * * @param listener */
public void setOnAbsListViewScrollListener(OnScrollListener scrollListener) {
mContentView.setOnAbsListViewScrollListener(scrollListener);
}
/** * 設置Recylerview的滾動監聽事件 */
public void setOnRecyclerViewScrollListener(
RecyclerView.OnScrollListener scrollListener) {
mContentView.setOnRecyclerViewScrollListener(scrollListener);
}
6.設置載入很多其它
假設希望在載入很多其它數據的時候。能在沒有新數據的時候。隱藏footerview的話,
new Handler().postDelayed(new Runnable() {
public void run() {
//模擬數據載入完畢
if (mLoadCount >= 3) {
xRefreshView.setLoadComplete(true);
}
adapter.insert(new Person("More ", "21"),
adapter.getAdapterItemCount());
adapter.insert(new Person("More ", "21"),
adapter.getAdapterItemCount());
adapter.insert(new Person("More ", "21"),
adapter.getAdapterItemCount());
mLoadCount++;
//刷新完畢必須調用此方法停止載入
xRefreshView.stopLoadMore();
}
}, 1000);
當調用xRefreshView.setLoadComplete(true)以后,就會隱藏footerview;假設過段時間又有新的數據了。能夠調用xRefreshView.setLoadComplete(false)。這樣就又能夠正常載入很多其它了。
7.其它一些屬性的設置
/** * 設置headerview回滾的時間,默認400毫秒 * * @param during */
public void setScrollDuring(int during) {
SCROLL_DURATION = during;
}
/** * 設置阻尼系數,建議使用默認的 * * @param ratio * 默認 1.8 */
public void setDampingRatio(float ratio) {
OFFSET_RADIO = ratio;
}
/** * 設置當下拉刷新完畢以后。headerview和footerview被固定的時間 * 注:考慮到ui效果,僅僅有時間大於1s的時候,footerview被固定的效果才會生效 * * @param pinnedTime */
public void setPinnedTime(int pinnedTime) {
mPinnedTime = pinnedTime;
mContentView.setPinnedTime(pinnedTime);
}
8.XRefreshView提供的監聽
public interface XRefreshViewListener {
/** * 下拉刷新的回調 */
public void onRefresh();
/** * 上拉載入很多其它的回調 */
public void onLoadMore();
/** * 用戶手指釋放的監聽回調 * * @param direction * >0: 下拉釋放。<0:上拉釋放 注:臨時沒有使用這種方法 */
public void onRelease(float direction);
/** * 獲取headerview顯示的高度與headerview高度的比例 * * @param offset * 移動距離和headerview高度的比例。范圍是0~1,0:headerview全然沒顯示 * 1:headerview全然顯示 * @param offsetY * headerview移動的距離 */
public void onHeaderMove(double offset, int offsetY);
}
9.自己定義header和footer
9.1.自己定義header
實現IHeaderCallBack接口。並繼承View就能夠自己定義headerview了
/** * 提供自己定義headerview的接口 * * @author huxq17@163.com * */
public interface IHeaderCallBack {
/** * 正常狀態 */
public void onStateNormal();
/** * 准備刷新 */
public void onStateReady();
/** * 正在刷新 */
public void onStateRefreshing();
/** * 刷新結束 */
public void onStateEnd();
/** * 獲取headerview顯示的高度與headerview高度的比例 * * @param offset * 移動距離和headerview高度的比例,范圍是0~1,0:headerview全然沒顯示 1:headerview全然顯示 * @param offsetY * headerview移動的距離 */
public void onHeaderMove(double offset, int offsetY);
/** * 設置顯示上一次刷新的時間 * * @param lastRefreshTime * 上一次刷新的時間 */
public void setRefreshTime(long lastRefreshTime);
/** * 隱藏footerview */
public void hide();
/** * 顯示footerview */
public void show();
/** * 獲得headerview的高度,假設不想headerview所有被隱藏,就能夠僅僅返回一部分的高度 * * @return */
public int getHeaderHeight();
}
這里須要介紹下幾種headerview的狀態
XRefreshView提供了不同狀態的回調,方便開發人員依據狀態來改變headerview的顯示,同一時候為了提供更加強大的支持。XRefreshView提供了onHeaderMove(double offset, int offsetY)回調來返回當前headerview移動的信息。這樣能夠更加自由的定制headerview。在繼承了View並實現了IHeaderCallBack接口以后,須要調用以下這種方法來設置自己定義headerview
refreshView.setCustomHeaderView(new CustomHeader(this));
9.2.自己定義footer
自己定義footer和自己定義header相似,都相同要實現接口,自己定義footer要實現 IFooterCallBack接口
public interface IFooterCallBack {
/** * 當不是到達底部自己主動載入很多其它的時候,須要自己寫點擊事件 * @param xRefreshViewListener */
public void callWhenNotAutoLoadMore(XRefreshViewListener xRefreshViewListener);
/** * 正常狀態,比如須要點擊footerview才干載入很多其它。主要是到達底部不自己主動載入很多其它時會被調用 */
public void onStateReady();
/** * 正在刷新 */
public void onStateRefreshing();
/** * 刷新結束 */
public void onStateFinish();
/** * 已無很多其它數據 */
public void onStateComplete();
/** * 隱藏footerview */
public void hide();
/** * 顯示footerview */
public void show();
/** * 獲得footerview的高度 * @return */
public int getFooterHeight();
}
footerview的狀態流程分成兩種
1.當到達底部自己主動載入很多其它:
1.1.還有很多其它數據
refreshing–>finish–>refreshing
1.2.已無很多其它數據
refreshing–>finish–>complete
2.當到達底部不自己主動載入很多其它:
2.1.還有很多其它數據
ready–>refreshing–>finish–>refreshing
2.2.已無很多其它數據
ready–>refreshing–>finish–>complete
當中,當不是到達底部自己主動載入很多其它的時候,須要自己寫點擊事件,就像這樣:
@Override
public void callWhenNotAutoLoadMore(final XRefreshViewListener listener) {
mClickView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(listener!=null){
listener.onLoadMore();
onStateRefreshing();
}
}
});
}
給footer設置點擊事件。在點擊事件中直接回調onLoadMore。而且進入刷新狀態。
還有就是footer的show和hide方法不能向header那樣:
header
/** * hide footer when disable pull load more */
public void hide() {
setVisibility(View.GONE);
}
public void show() {
setVisibility(View.VISIBLE);
}
直接gone會給列表底部留下空白。所以應該這樣
public void hide() {
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mContentView
.getLayoutParams();
lp.height = 0;
mContentView.setLayoutParams(lp);
}
public void show() {
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) mContentView
.getLayoutParams();
lp.height = LayoutParams.WRAP_CONTENT;
mContentView.setLayoutParams(lp);
}
最后也須要通過以下這種方法來設置自己定義footerview
refreshView.setCustomFooterView(new CustomFooterView(this));
10.Recylerview的Adapter
Recylerview的adapter必須繼承自UltimateViewAdapter。具體使用方法能夠參照demo中的SimpleAdapter,此外,給Recylerview設置自己定義footerview和設置自己定義headerview是不一樣的。設置自己定義headerview是通過XRefreshView來設置的,可是設置自己定義footerview確是通過UltimateViewAdapter來設置的。具體例如以下:
UltimateViewAdapter
/** * Using a custom LoadMoreView * * @param customview * the inflated view */
public void setCustomLoadMoreView(View footerView) {
if (footerView instanceof IFooterCallBack) {
customLoadMoreView = footerView;
} else {
throw new RuntimeException(
"footerView must be implementes IFooterCallBack!");
}
}
......
adapter.setCustomLoadMoreView(footerView);
注:眼下上拉載入很多其它僅僅支持Linearlayoutmanager。我還在找解決的方法。
最后
XRefreshView托管於github。點此前往下載,歡迎start or fork。
參考的項目
在開發過程中有參考一些非常不錯的開源項目。各自是