標籤:xrefreshview 萬能的下拉上拉重新整理架構 github 自訂view
一、寫在開頭的話
之所以寫這個東西是因為項目中有用到,需要給stickylistheaders加個重新整理,其實就是個framelayout裡面有個listview的自訂view布局,但是一些知名的重新整理架構我試了下都不支援,pulltoRefresh和XListView都是自己實現了一個可重新整理的view,然後讓我們來直接使用這個可重新整理的view,從而達到可以上拉下拉重新整理的目的。我這個需求需要的是一個我告訴他什麼時候需要重新整理他就能幫我重新整理的架構,也就是說不管什麼view,只要能告訴架構自己什麼時候需要重新整理,架構就可以給你在什麼時候重新整理,從這個角度上來說,這個架構是萬能的,適用於所有的view,他就是我接下來要介紹的——XRefreshView。
二、
gif上看的效果可能不是很好有點卡卡的,但是在真機上面,還是挺流暢的。
三、簡單用法
XRefreshView現階段預設支援ListView,GridView,WebView,當然還可以支援scrollview,textview,只不過現在沒有加進去,加進去也很簡單的。
對於任何想要重新整理的view,只需要在想要重新整理的view外面套一層XRefreshView就可以了,就像這樣
<com.andview.refreshview.XRefreshView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xrefreshview="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/custom_view" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#fff" android:orientation="vertical" xrefreshview:isHeightMatchParent="true" xrefreshview:isWidthMatchParent="true" > <ListView android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="wrap_content" /> <!-- xmlns:xrefreshview="http://schemas.android.com/apk/res/com.andview.refreshview" --></com.andview.refreshview.XRefreshView>
其中的xrefreshview標籤是我自訂的一些屬性
<declare-styleable name="XRefreshView"> <attr name="isHeightMatchParent" format="boolean" /> <attr name="isWidthMatchParent" format="boolean" /> <attr name="autoRefresh" format="boolean" /> </declare-styleable> <declare-styleable name="StickyListHeadersListView">
isHeightMatchParent和isWidthMatchParent代表寬高是否充滿parent,為什麼需要這兩個屬性呢?
嗯,是這樣的,我在做stickylistheaders下拉重新整理的時候,發現會丟幀、卡頓的情況。之後在解決問題的過程中,我發現主要的耗時都發生在onMeasure過程中,也就是說系統在測量view的尺寸的時候會消耗太多的時間從而導致卡頓。知道了問題在哪,接下來就得去解決他。很明顯有兩種方案:1、重寫stickylistheaders,使其在測量的時候效率更高;2、找自己的原因。第一種方案代價有點大,所以我就在找自己的原因,後來在網上看到這麼一篇文章,Android View.onMeasure方法的理解
他其中有提到,當我們設定width或height為fill_parent時,容器在布局時調用子view的measure方法傳入的模式是EXACTLY,因為子view會佔據剩餘容器的空間,所以它大小是確定的,當設定為 wrap_content時,容器傳進去的是AT_MOST,表示子view的大小最多是多少。然後我有看了看我的布局
<com.andview.refreshview.XRefreshView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:xrefreshview="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/custom_view" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#fff" xrefreshview:autoRefresh="true" > <com.example.xrefreshviewdemo.stickyListHeaders.StickyListHeadersListView android:id="@+id/sticky_list" android:layout_width="match_parent" android:layout_height="wrap_content" /></com.andview.refreshview.XRefreshView>
height是設為wrap_content的,當我換成match_parent以後問題就解決了。我就在想,可能是因為系統在測量的時候,你告訴系統一個精確的尺寸,系統會非常高興,一高興效率就高了。
所以如果你用的是一個比較複雜的view,而且用重新整理會有卡頓的話,不妨設定寬高為match_parent,而XRefreshView則自動幫你做了這件事,預設的isHeightMatchParent和isWidthMatchParent都為true。但是如果你有自己特殊的需要,你可以在布局中把他們設為false。
autoRefresh是指剛進入頁面時view是否自動重新整理
3.1 XRefreshView預設支援的view
接下來對於XRefreshView預設支援的view來說,在java代碼裡需要這樣做
// 設定是否可以上拉重新整理refreshView.setPullLoadEnable(true);
設定是否可以上拉重新整理,預設是不可以的
// 設定重新整理view的類型refreshView.setRefreshViewType(XRefreshViewType.ABSLISTVIEW);
設定要重新整理view的類型,先看下XRefreshViewType這個類
/** * 支援下拉上拉重新整理的view * @author [email protected] * */public enum XRefreshViewType {NOSCROLLVIEW, ABSLISTVIEW, SCROLLVIEW, WEBVIEW,NONE}分別是不可滾動的view,abslistview,scrollview,webview和其他
在使用的時候需要注意,只有XRefreshView預設支援的view才需要設定view的類型,但如果你是自訂view就不需要設定了。
//設定是否可以自動重新整理refreshView.setAutoRefresh(true);
設定是否自動重新整理,預設為false。這裡也可以在xml裡配置,但優先順序是java代碼裡更高一些,也就是說如果在xml中配置為false,但是java代碼中設定為true的話,那麼到時是會自動重新整理的,不過話又說回來,誰會閑的蛋疼這麼做呢。
public static long lastRefreshTime;
//設定上次重新整理的時間refreshView.restoreLastRefreshTime(lastRefreshTime);
設定上次重新整理的時間,這裡我先定義了一個靜態long型的常量,之所以是靜態是為了讓程式能夠一直保持他的值不變,這是我偷懶的寫法,如果你真的需要在重新整理的header上面顯示多久之前重新整理的話,你可以把這個值存到本地。lastRefreshTime是XRefreshView返回供應用持久化儲存用的,具體在代碼裡是這樣的:
refreshView.setXRefreshViewListener(new XRefreshViewListener() {@Overridepublic void onRefresh() {new Handler().postDelayed(new Runnable() {@Overridepublic void run() {refreshView.stopRefresh();lastRefreshTime = refreshView.getLastRefreshTime();}}, 2000);}@Overridepublic void onLoadMore() {new Handler().postDelayed(new Runnable() {@Overridepublic void run() {refreshView.stopLoadMore();}}, 2000);}});這裡正真涉及到了上拉和下拉重新整理這塊,如果想要監聽重新整理事件,需要先註冊監聽,方法是refreshView.setXRefreshViewListener,參數是一個重新整理的監聽介面XRefreshViewListener,其中onRefresh是在下拉重新整理時會回調,而onLoadMore則在上拉重新整理時會回調,你需要做的就是在這裡面處理資料的重新整理,等到資料重新整理完成以後,XRefreshView分別提供了stopRefresh和stopLoadMore來分別停止下拉重新整理和來停止上拉重新整理的UI。前面說到lastRefreshTime,在停止重新整理的時候,會通過getLastRefreshTime這個方法把這次的重新整理時間傳遞給你,你就可以做本地化儲存,以供下次使用。
3.2自訂view
如果想要重新整理自訂view,XRefreshView也是提供支援的。
refreshView.setRefreshBase(new XRefreshContentViewBase() {@Overridepublic boolean isTop() {return stickyLv.getFirstVisiblePosition() == 0;}@Overridepublic boolean isBottom() {return stickyLv.getLastVisiblePosition() == mTotalItemCount - 1;}});自訂view需要自己實現重新整理規則來告訴XRefreshView什麼時候自訂view到達了頂部,什麼時候到達了底部。怎麼樣?是不是很方便!XRefreshView只需要你提供自訂view需要重新整理的時機,其他一切都放心的交給XRefreshView吧,他會幫你解決一切!
接下來,XRefreshView會把重新整理的header和footer丟出來,這樣,在應用裡就可以就可以定義自己的header和footer了。
四、
先介紹如何使用,接下來的文章會介紹下XRefreshView是怎麼實現的。
如果你對XRefreshView感興趣,可以在github上關注XRefreshView
當然你也可以點此直接下載
如果你有好的建議,也歡迎和我聯絡,可以直接在github上推給我,或者聯絡我郵箱:[email protected]
打造android萬能上拉下拉重新整理架構——XRefreshView (一)