MaterialRefreshLayout+ListView 下拉刷新 上拉加載

效果圖是這樣的,有入侵式的,非入侵式的,帶波浪效果的......就那幾個屬性,都給出來了,本身去試就行。android

 

下拉刷新 上拉加載 關於下拉刷新-上拉加載的效果,有許許多多的實現方式,百度了一下居然有幾十種第三方的能夠實現......app

SwipeRefreshLayout是Google官方推出的一個控件,不須要添加依賴什麼的,直接使用便可,可是隻支持下拉刷新,上拉加載沒有實現,包括點擊事件什麼的也沒有很好的集成,若是你的需求僅僅是列表展現,下拉刷新的話不妨一試,仍是挺簡單的。ide

BGARefreshLayout支持四種下拉刷新和一種上拉加載效果,也很是不錯,值得一試。佈局

還有BRVAH,一個更增強大的第三方庫,使用BRVAH能夠知足你大部分的需求,本文不作講解,下篇文章再展開探討。post

BRVAH官網連接:(很是推薦用這個)http://www.recyclerview.org/this

 

本文要講的是MaterialRefreshLayout,由於僅僅演示刷新和加載效果,因此簡單的用了ListView,也沒有本身寫適配器,簡單的用了系統自帶的ArrayAdapter。正常應該用RecycleView,畢竟能夠自定義事件嘛。spa

1.首先添加依賴。線程

compile 'com.cjj.materialrefeshlayout:library:1.3.0'code

2.佈局文件:xml

若是複製過去的話可能會報錯,不要緊,從新加載一下項目就能夠了。建議手寫。

 1 <com.cjj.MaterialRefreshLayout  
 2     android:id="@+id/refresh"  
 3     xmlns:android="http://schemas.android.com/apk/res/android"  
 4     xmlns:app="http://schemas.android.com/apk/res-auto"  
 5     android:layout_width="match_parent"  
 6     android:layout_height="match_parent"  
 7     app:overlay="false"  
 8     app:wave_show="true"  
 9     >  
10   
11     <ListView  
12         android:id="@+id/listview"  
13         android:layout_width="match_parent"  
14         android:layout_height="match_parent"/>  
15 </com.cjj.MaterialRefreshLayout>

還有幾個屬性能夠本身試一試:

app:wave_height_type="higher" 改變刷新佈局的高度
app:wave_color="#61bf5c"改變刷新佈局的背景顏色

 

3.初始化控件並給ListView設置適配器:

 1 private MaterialRefreshLayout mMaterialRefreshLayout;
 2 private ListView mListView;
 3 private ArrayList<String> list = new ArrayList<String>();
 4 private ArrayAdapter mArrayList;
 5 
 6 
 7 
 8 mMaterialRefreshLayout = (MaterialRefreshLayout)findViewById(R.id.refresh);
 9 mListView = (ListView) findViewById(R.id.listview);
10 mArrayList = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list);
11 mListView.setAdapter(mArrayList);
1     /**
2      * todo 在上拉刷新的時候,判斷,是否處於上拉刷新,若是是的話,就禁止在一次刷新,保障在數據加載完成以前
3      * todo 避免重複和屢次加載
4      */
5     private Boolean isLoadMore = true;

 

4.獲取數據(這裏用的是假數據):

1     private void initDate() {
2         for (int i = 0;i<6;i++) {
3             list.add("Test3Test3Test3");
4             list.add("Test4Test4Test4Test4");
5             list.add("Test5Test5Test5Test5Test5");
6         }
7     }

5.設置容許上拉加載更多,默認只容許下拉刷新不容許上拉加載。

        /**
         * todo 設置是否上拉加載更多,默認是false,要手動改成true,要否則不會出現上拉加載
         */
        mMaterialRefreshLayout.setLoadMore(isLoadMore);

6.設置下拉、上拉的監聽事件(重點):

注意事項註釋都有標註。

 

 1             mMaterialRefreshLayout.setMaterialRefreshListener(new MaterialRefreshListener() {
 2             @Override
 3             public void onRefresh(MaterialRefreshLayout materialRefreshLayout) {
 4                 mMaterialRefreshLayout.finishRefreshLoadMore();
 5                 //todo 通常加載數據都是在子線程中,這裏我用到了handler
 6                 new Handler().postDelayed(new Runnable() {
 7                     @Override
 8                     public void run() {
 9                         for (int i = 0; i <= 3; i++) {
10                             list.add(i,"下拉刷新 " + i);
11                         }
12                         mArrayList.notifyDataSetChanged();//todo 通知刷新
13 
14                         //下拉刷新中止
15                         mMaterialRefreshLayout.finishRefresh();
16                     }
17                 },3000);
18             }
19 
20 
21 
22 
23 
24             //todo 真正用的時候,就會去定義方法,獲取數據,通常都是分頁,在數據端獲取的時候,把頁數去增長一,而後在去服務端去獲取數據
25             @Override
26             public void onRefreshLoadMore(MaterialRefreshLayout materialRefreshLayout) {
27                 super.onRefreshLoadMore(materialRefreshLayout);
28                 mMaterialRefreshLayout.finishRefresh();
29                 new Handler().postDelayed(new Runnable() {
30                     @Override
31                     public void run() {
32                         isLoadMore = false;//todo 上拉的時候把下拉取消
33                         for (int i = 0; i <= 3; i++) {
34                             list.add("上拉加載" + i);
35                         }
36                         //todo 通知刷新
37                         mArrayList.notifyDataSetChanged();
38 
39                         /**
40                          * 完成加載數據後,調用此方法,要否則刷新的效果不會消失
41                          */
42                         mMaterialRefreshLayout.finishRefreshLoadMore();
43                     }
44                 }, 3000);
45             }

在代碼中也能夠動態設置各類屬性:後兩個一個是自動下拉刷新,一個是自動上拉加載

1 materialRefreshLayout.setIsOverLay(true);
2 materialRefreshLayout.setWaveShow(false);
3 materialRefreshLayout.setWaveColor(0xffffffff);
4 materialRefreshLayout.setLoadMore(true);
5 materialRefreshLayout.autoRefresh();
6 aterialRefreshLayout.autoRefreshLoadMore();

 

 

 

整體代碼給一個,僅供參考:

 1     private MaterialRefreshLayout mMaterialRefreshLayout;
 2     private ListView mListView;
 3     private ArrayList<String> list = new ArrayList<String>();
 4     private ArrayAdapter mArrayList;
 5 
 6     /**
 7      * todo 在上拉刷新的時候,判斷,是否處於上拉刷新,若是是的話,就禁止在一次刷新,保障在數據加載完成以前
 8      * todo 避免重複和屢次加載
 9      */
10     private Boolean isLoadMore = true;
11 
12     @Override
13     protected void onCreate(Bundle savedInstanceState) {
14         super.onCreate(savedInstanceState);
15         setContentView(R.layout.activity_material_refresh_layout);
16         initDate();
17         initView();
18     }
19 
20     //假數據
21     private void initDate() {
22         for (int i = 0;i<6;i++) {
23             list.add("Test3Test3Test3");
24             list.add("Test4Test4Test4Test4");
25             list.add("Test5Test5Test5Test5Test5");
26         }
27     }
28 
29     private void initView() {
30         mMaterialRefreshLayout = (MaterialRefreshLayout)findViewById(R.id.refresh);
31         mListView = (ListView) findViewById(R.id.listview);
32         mArrayList = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list);
33         mListView.setAdapter(mArrayList);
34 
35         /**
36          * todo 設置是否上拉加載更多,默認是false,要手動改成true,要否則不會出現上拉加載
37          */
38         mMaterialRefreshLayout.setLoadMore(isLoadMore);
39         mMaterialRefreshLayout.setMaterialRefreshListener(new MaterialRefreshListener() {
40             @Override
41             public void onRefresh(MaterialRefreshLayout materialRefreshLayout) {
42                 mMaterialRefreshLayout.finishRefreshLoadMore();
43                 //todo 通常加載數據都是在子線程中,這裏我用到了handler
44                 new Handler().postDelayed(new Runnable() {
45                     @Override
46                     public void run() {
47                         for (int i = 0; i <= 3; i++) {
48                             list.add(i,"下拉刷新 " + i);
49                         }
50                         mArrayList.notifyDataSetChanged();//todo 通知刷新
51 
52                         //下拉刷新中止
53                         mMaterialRefreshLayout.finishRefresh();
54                     }
55                 },3000);
56             }
57 
58             //todo 真正用的時候,就會去定義方法,獲取數據,通常都是分頁,在數據端獲取的時候,把頁數去增長一,而後在去服務端去獲取數據
59             @Override
60             public void onRefreshLoadMore(MaterialRefreshLayout materialRefreshLayout) {
61                 super.onRefreshLoadMore(materialRefreshLayout);
62                 mMaterialRefreshLayout.finishRefresh();
63                 new Handler().postDelayed(new Runnable() {
64                     @Override
65                     public void run() {
66                         isLoadMore = false;//todo 上拉的時候把下拉取消
67                         for (int i = 0; i <= 3; i++) {
68                             list.add("上拉加載" + i);
69                         }
70                         //todo 通知刷新
71                         mArrayList.notifyDataSetChanged();
72 
73                         /**
74                          * 完成加載數據後,調用此方法,要否則刷新的效果不會消失
75                          */
76                         mMaterialRefreshLayout.finishRefreshLoadMore();
77                     }
78                 }, 3000);
79             }
80         });
81     }
82 
83 
84     public void goBack(View view) {
85         finish();
86     }
相關文章
相關標籤/搜索