1. 程式人生 > >打造android萬能上拉下拉重新整理框架——XRefreshView (一)

打造android萬能上拉下拉重新整理框架——XRefreshView (一)

一、寫在開頭的話

之所以寫這個東西是因為專案中有用到,需要給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() {

			@Override
			public void onRefresh() {

				new Handler().postDelayed(new Runnable() {
					@Override
					public void run() {
						refreshView.stopRefresh();
						lastRefreshTime = refreshView.getLastRefreshTime();
					}
				}, 2000);
			}

			@Override
			public void onLoadMore() {
				new Handler().postDelayed(new Runnable() {

					@Override
					public 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() {

			@Override
			public boolean isTop() {
				return stickyLv.getFirstVisiblePosition() == 0;
			}

			@Override
			public boolean isBottom() {
				return stickyLv.getLastVisiblePosition() == mTotalItemCount - 1;
			}
		});
自定義view需要自己實現重新整理規則來告訴XRefreshView什麼時候自定義view到達了頂部,什麼時候到達了底部。怎麼樣?是不是很方便!XRefreshView只需要你提供自定義view需要重新整理的時機,其他一切都放心的交給XRefreshView吧,他會幫你解決一切!

接下來,XRefreshView會把重新整理的header和footer丟出來,這樣,在應用裡就可以就可以定義自己的header和footer了。

四、

先介紹如何使用,接下來的文章會介紹下XRefreshView是怎麼實現的。

如果你有好的建議,也歡迎和我聯絡,可以直接在github上推給我,或者聯絡我郵箱:[email protected]


csdn下載點的原始碼是之前上傳,有bug的,建議下載github上的原始碼。

相關推薦

打造android萬能重新整理框架——XRefreshView ()

一、寫在開頭的話 之所以寫這個東西是因為專案中有用到,需要給stickylistheaders加個重新整理,其實就是個framelayout裡面有個listview的自定義view佈局,但是一些知名的重新整理框架我試了下都不支援,pulltoRefresh和XListVie

Html5模擬android/重新整理

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ include file="/WEB-INF/tld/taglibs.jsp"%> <%@pa

android 簡單重新整理功能

事件處理  @Override public boolean onTouch(View v, MotionEvent event) { float y = event.getY(); switch (event.getAction()) {

android 模仿知乎重新整理載入

效果圖如下 activity_main.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/

Android--PullToRefreshListView 重新整理(設定重新整理時的樣式)

一:在使用PullToRefreshListView時,一定要先導包 然後點選Import Module 將library包匯入進去(這裡因為我已經導過了,所以使用library1) 現在將已經導完的包新增到wome我們的Module裡面 點選倒數第三個,

Android仿蘋果版QQ重新整理實現() ——打造簡單平滑的通用重新整理控制元件

前言: 因為公司人員變動原因,導致了博主四個月沒有動安卓,一直在做IOS開發,如今接近年前,終於可以花一定的時間放在安卓上了.好了,廢話不多說,今天我們要帶來的效果是蘋果版本的QQ下拉重新整理.首先看一下目標效果以及demo效果:      因為此效果實現的步驟較多,所

android 實現有阻尼/重新整理列表

        在上一篇文章《有阻尼下拉重新整理列表的實現》中,我解析瞭如何基於過載dispatchDraw方法重畫子View和過載onTouchEvent方法監控受試來實現下拉重新整理列表,而在這篇文章中,我將會基於上一篇文章介紹的技術,在下拉重新整理列表PullToRe

Android實現RecyclerView的刷新和載入很多其它

listen gre scheme void fadein 有一個 hot [] study 需求 先上效果圖, Material Design風格的下拉刷新和上拉載入很多其它。 源代碼地址(歡迎star) https://github.com

Android仿蘋果版QQ刷新實現() ——打造簡單平滑的通用刷新控件

公司 ase pda false 當前 undle nat rst urn 前言: 因為公司人員變動原因,導致了博主四個月沒有動安卓,一直在做IOS開發,如今接近年前,終於可以花一定的時間放在安卓上了.好了,廢話不多說,今天我們要帶來的效果是蘋果版本的QQ下拉刷新.首先看

android之XListview,出現BUG

第一次發,不要吐槽哈 上拉載入若螢幕資料不滿會出bug;若上拉後再去下拉也會出現bug,即資料跟著手勢移動不復原 上拉載入,資料未充滿螢幕時出現bug,解決方式:在XListView中去掉onTouchEvent()方法中default下的else public boolean onTo

Xlistview+多條目+重新整理載入+側滑

** MainActivity頁面 ** package com.example.lx_module.activity; import android.os.Bundle; import android.support.annotation.NonNull; import an

輪播+重新整理+資料庫

** MainActivity ** package com.example.lx_zz.activity; import android.annotation.SuppressLint; import android.support.design.widget.TabLayo

Android PullToRefresh ListView GridView 重新整理 使用詳解

                轉載請標明出處:http://blog.csdn.net/lmj623565791/article/details/38238749,本文出自:【張鴻洋的部落格】群裡一哥們今天聊天偶然提到這個git hub上的控制元件:pull-to-refresh ,有興趣的看下,例子中的功

翻翻git之---RecycleView的,重新整理,樣式切換,新增foot和header的強大庫 RecyclerViewManager

前兩天寫了一個上拉重新整理的,今天看到個上下拉都可重新整理還實現了foot 和header以及3種RecycleView樣式的切換就給大家介紹下,先貼下foot部分因為例項中並沒加入foot 這部圖片大小 沒搞好 再貼一下2個重新整理的效果

Android重寫ScrollView實現回彈,頭部放大功能

效果圖: 自定義ScrollView: public class MyScrollView extends ScrollView { //----頭部收縮屬性-------- // 記錄首次按下位置 private float mFirstPositi

android listview至底部或者頂部出現藍色邊緣

Overscroll(邊界回彈)效果-- android2.3新增的功能,也就是當滑動到邊界的時候,如果再滑動,就會有一個邊界就會有一個發光效果。* Api介紹:* public void setOverScrollMode (int mode)* 為檢視設定過滾動模式。有

Android高仿QQ重新整理

此次牽扯到的知識點有:Android手勢,Handler,java多執行緒,java聚合,Android幀動畫,屬性動畫; 如果有對上述提到過的知識點不太瞭解,或者程式設計能力較差的小夥伴可以關閉此頁面啦一,因為接下來的裝逼過程 你可能會是一臉懵B 。如果你執意要看也沒事啦,因

解決iscroll.js重新整理手指劃出螢幕頁面無法回彈問題

使用過iscroll.js的上拉下拉重新整理效果的朋友應該都碰到過這個問題:在iOS的瀏覽器中,上拉或下拉重新整理時,當手指劃出屏幕後,頁面無法彈回。很多人因為解決不了這個問題,乾脆就那樣不解決了,還有的直接就不用HTML了,使用原生代替HTML頁面。 相信很多朋友也有

IOS 處理分頁資料的重新整理

@interface Phy_PackagesController () { MKNetworkOperation *op; NSMutableArray *array; NSMutableArray *array2; NSInteger

關於在jquery中使用iscorll實現載入重新整理的方法

實現原理是:判斷fiiptop,flipdown是否顯示為依據myScroll = new iScroll('wraphome', { fixedScrollbar: true, hideScrollbar: