Material Design 實戰(zhàn) 之第五彈 —— 下拉刷新(SwipeRefreshLayout)


本模塊共有六篇文章哮兰,參考郭神的《第一行代碼》聚磺,對Material Design的學(xué)習(xí)做一個詳細(xì)的筆記,大家可以一起交流一下:






引子:



文章提要與總結(jié)


SwipeRefreshLayout  ÷赘/swa?p/

    1.SwipeRefreshLayout即是實現(xiàn)下拉刷新功能的核心類泄伪,它由support-v4庫提供的挫望;

    2.把想要實現(xiàn)下拉刷新功能的控件放置到SwipeRefreshLayout里邊立润,即可迅速讓這個控件支持下拉刷新了;

    3.接下來在對應(yīng)的java代碼中處理具體的刷新邏輯:
        3.1 實例化SwipeRefreshLayout媳板;
        3.2 調(diào)用setcolorSchemeResources()方法來設(shè)置下拉刷新進(jìn)度條的顏色桑腮;
        3.3 調(diào)用setonRefreshListener()方法設(shè)置一個下拉刷新的監(jiān)聽器, 
            傳入一個SwipeRefreshLayout.OnRefreshListener()并重寫onRefresh()來處理具體的刷新邏輯蛉幸;
        3.4 刷新邏輯使用中可以使用如下多線程結(jié)構(gòu):
         new Thread(new Runnable() {
            @Override
            public void run() {
                try{

                }catch (InterruptedException e){
                    e.printStackTrace();
                }
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {

                    }
                });
            }
        }).start();
    其中try中書寫耗時操作破讨,然后在 runOnUiThread() 中的 run() 中獲取到數(shù)據(jù),
    并adapter.notifyDataSetChanged()調(diào)用刷新數(shù)據(jù)奕纫;
    最后調(diào)用swipeRefreshLayout的setRefreshing()并傳入false提陶,表示刷新事件結(jié)束同時隱藏刷新進(jìn)度條;

效果圖:




正文


SwipeRefreshLayout

  (英 [swa?p])

SwipeRefreshLayout即是實現(xiàn)下拉刷新功能的核心類匹层,它由support-v4庫提供的隙笆。

把想要實現(xiàn)下拉刷新功能的控件放置到SwipeRefreshLayout里邊凭豪,即可迅速讓這個控件支持下拉刷新了天揖。
而在這里的實戰(zhàn)項目(MaterialTest)中,應(yīng)該支持下拉刷新功能的控件是RecyclerView展运。

下面直接開始使用它您访。修改activity-main.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

       <android.support.design.widget.AppBarLayout
           android:layout_width="match_parent"
           android:layout_height="wrap_content">
           <android.support.v7.widget.Toolbar
               android:id="@+id/toolbar"
               android:layout_width="match_parent"
               android:layout_height="?attr/actionBarSize"
               android:background="?attr/colorPrimary"
               android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
               app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
               app:layout_scrollFlags="scroll|enterAlways|snap"/>
       </android.support.design.widget.AppBarLayout>

        <android.support.v4.widget.SwipeRefreshLayout
            android:id="@+id/swipe_refresh"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior = "@string/appbar_scrolling_view_behavior">
            <android.support.v7.widget.RecyclerView
                android:id="@+id/recycler_view"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
        </android.support.v4.widget.SwipeRefreshLayout>

        <android.support.design.widget.FloatingActionButton
            android:id="@+id/fab"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|end"
            android:layout_margin="16dp"
            android:src="@drawable/ic_done"
            app:elevation="8dp"/>
    </android.support.design.widget.CoordinatorLayout>

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:menu="@menu/nav_menu"
        app:headerLayout="@layout/nav_header">

    </android.support.design.widget.NavigationView>

</android.support.v4.widget.DrawerLayout>

這里在RecyclerView的外面再嵌套一層SwipeRefreshLayout铅忿,讓RecyclerView實現(xiàn)下拉刷新功能。

另注意灵汪,
由于RecyclerView現(xiàn)在變成了Swipe-RefreshLayout的子控件檀训,
因此之前使用app:layout_behavxor聲明的布局行為現(xiàn)在也要移到SwipeRefreshLayout中才行。

當(dāng)然享言,雖RecyclerView已經(jīng)支持下拉刷新功能肢扯,但還要在代碼中處理具體的刷新邏輯才行。
下面修改MainActivity:

//下拉刷新
    private SwipeRefreshLayout swipeRefresh;
------------------------------------


 //下拉刷新邏輯處理
        swipeRefresh = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh);
        swipeRefresh.setColorSchemeResources(R.color.colorPrimary);
        swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.
                OnRefreshListener(){
            @Override
            public void onRefresh() {
                refreshFruits();
            }
        });
------------------------------------

 private void refreshFruits(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try{
                    Thread.sleep(2000);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        initFruits();
                        adapter.notifyDataSetChanged();
                        swipeRefresh.setRefreshing(false);
                    }
                });
            }
        }).start();
    }

這里担锤,
首先實例化SwipeRefreshLayout蔚晨,
然后調(diào)用setcolorSchemeResources()方法來設(shè)置下拉刷新進(jìn)度條的顏色,這里使用主題中的colorPrimary作為進(jìn)度條的顏色。
接著調(diào)用setonRefreshListener()方法設(shè)置一個下拉刷新的監(jiān)聽器铭腕,當(dāng)觸發(fā)了下拉刷新操作的時候就會回調(diào)這個監(jiān)聽器的onRefresh()方法银择,在這個方法中處理具體的刷新邏輯。(這里可以類比setOnClickListener理解)

通常onRefresh()方法中應(yīng)該是去網(wǎng)絡(luò)上請求最新的數(shù)據(jù)累舷,然后再將這些數(shù)據(jù)展示出來浩考。
這里就不和網(wǎng)絡(luò)交互了,簡單地寫一個refreshFruits()方法并調(diào)用它進(jìn)行本地刷新操作被盈。

refreshFruits()方法中先是開啟了一個線程析孽,然后將線程沉睡兩秒鐘,模擬刷新的等待過程只怎。
因為本地刷新操作速度非惩嗨玻快,如果不將線程沉睡的話身堡,刷新會即刻結(jié)束而看不到刷新的過程邓尤。
沉睡結(jié)束后使用run0nUiThread()方法將線程切換回主線程,
調(diào)用initFruits()方法重新生成數(shù)據(jù)贴谎,
接著調(diào)用FruitAdapter的notifyDataSetChanged()通知數(shù)據(jù)發(fā)生了變化并刷新adapter里面的數(shù)據(jù)汞扎,
最后調(diào)用swipeRefreshLayout的setRefreshing()并傳入false,表示刷新事件結(jié)束同時隱藏刷新進(jìn)度條擅这。

重新運行一下程序澈魄,在屏幕的主界面向下拖動,會出現(xiàn)下拉刷新的進(jìn)度條仲翎,松手后就會自動進(jìn)行刷新了一忱,效果如圖:

刷新中

刷新后

下拉刷新進(jìn)度條會停留兩秒鐘,隨后自動消失谭确,水果列表也會更新了帘营。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市逐哈,隨后出現(xiàn)的幾起案子芬迄,更是在濱河造成了極大的恐慌,老刑警劉巖昂秃,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件禀梳,死亡現(xiàn)場離奇詭異,居然都是意外死亡肠骆,警方通過查閱死者的電腦和手機(jī)算途,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚀腿,“玉大人嘴瓤,你說我怎么就攤上這事扫外。” “怎么了廓脆?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵筛谚,是天一觀的道長。 經(jīng)常有香客問我停忿,道長驾讲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任席赂,我火速辦了婚禮吮铭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘颅停。我一直安慰自己谓晌,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布便监。 她就那樣靜靜地躺著,像睡著了一般碳想。 火紅的嫁衣襯著肌膚如雪烧董。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天胧奔,我揣著相機(jī)與錄音逊移,去河邊找鬼。 笑死龙填,一個胖子當(dāng)著我的面吹牛胳泉,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播岩遗,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼扇商,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了宿礁?” 一聲冷哼從身側(cè)響起案铺,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎梆靖,沒想到半個月后控汉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡返吻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年姑子,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片测僵。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡街佑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情舆乔,我是刑警寧澤岳服,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站希俩,受9級特大地震影響吊宋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜颜武,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一璃搜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鳞上,春花似錦这吻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鬼贱,卻和暖如春移怯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背这难。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工舟误, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人姻乓。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓嵌溢,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蹋岩。 傳聞我的和親對象是個殘疾皇子赖草,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,666評論 2 350

推薦閱讀更多精彩內(nèi)容