Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> RecyclerView 實現下拉刷新和自動加載,recyclerview下拉

RecyclerView 實現下拉刷新和自動加載,recyclerview下拉

編輯:關於android開發

RecyclerView 實現下拉刷新和自動加載,recyclerview下拉


RecyclerView是 Android 兼容包V21中新推出的列表類,它的自定義化強的優點足以讓它能夠取代GridView和ListView,本文將結合SwipeRefreshLayout與RecyclerView講解如何實現下拉刷新和自動加載的代碼

需要的依賴

以下版本自行更新

          Java   1 2 3 4 compile 'com.android.support:appcompat-v7:21.0.0' compile 'com.android.support:recyclerview-v7:21.0.0' compile 'com.android.support:cardview-v7:21.0.0' compile 'com.android.support:support-v4:21.0.0'

 

需要解決的問題

  • [x] 下拉刷新
  • [x] 自動加載
  • [x] 網絡請求異步加載

技術處理

下拉刷新

采用 android.support.v4.widget.SwipeRefreshLayout 來實現
具體可以搜索這個class,我們按照官方文檔,布局如下

          Java   1 2 3 4 5 6 7 8 9 10 11 12 <view xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/swipeRefreshLayout" class="android.support.v4.widget.SwipeRefreshLayout" android:layout_width="match_parent" android:layout_height="match_parent">       <view xmlns:android="http://schemas.android.com/apk/res/android"         android:id="@+id/recylerView"         class="android.support.v7.widget.RecyclerView"         android:layout_width="wrap_content"         android:layout_height="wrap_content"></view> </view>

然後對 swipeRefreshLayout 設置監聽即可

            Java   1 2 3 4 5 6 7 8 9 10 swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {         @Override         public void onRefresh() {             if(isrefreshing){                 Log.d(TAG,"ignore manually update!");             } else{                  loadPage();             }         }     });

自動加載

RecyclerView是一個新興事物,伸手黨們還找不到 endless-RecyclerView 這樣的開源神器,只好自己找方法了,同ListView一樣,還是重寫 OnScrollListener 這個方法

            Java   1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {             @Override             public void onScrolled(RecyclerView recyclerView, int dx, int dy) {                 super.onScrolled(recyclerView, dx, dy);                 int lastVisibleItem = ((LinearLayoutManager) mLayoutManager).findLastVisibleItemPosition();                 int totalItemCount = mLayoutManager.getItemCount();                 //lastVisibleItem >= totalItemCount - 4 表示剩下4個item自動加載,各位自由選擇                 // dy>0 表示向下滑動                 if (lastVisibleItem >= totalItemCount - 4 && dy > 0) {                     if(isLoadingMore){                          Log.d(TAG,"ignore manually update!");                     } else{                          loadPage();//這裡多線程也要手動控制isLoadingMore                         isLoadingMore = false;                     }                 }             }         });

如果想用GridView,可以試試這個,注意例子裡的span_count =2

            Java   1 2 3 4 5 6 7 8 9 10 11 12 @Override       public void onScrolled(RecyclerView recyclerView, int dx, int dy) {         super.onScrolled(recyclerView, dx, dy);         int[] visibleItems = mLayoutManager.findLastVisibleItemPositions(null);         int lastitem = Math.max(visibleItems[0],visibleItems[1]);         Log.d(TAG,"visibleItems =" + visibleItems);         Log.d(TAG,"lastitem =" + lastitem);         Log.d(TAG,"adapter.getItemCount() =" + adapter.getItemCount());         if (dy > 0 && lastitem > adapter.getItemCount() - 5 && !isLoadingMore) {           Log.d(TAG,"will loadNewFeeds");         }       }

網絡請求異步加載

我這裡的 loadPage 是基於 Retrofit 構建的,輸入參數是一個Map,它的回調功能非常實用,可以直接控制UI更新,流程圖如下,大家可以參考一下設計

 

loadPage 流程圖
參考文獻
    • 俄國佬代碼
    • ListView祖傳代碼

問啊-一鍵呼叫程序員答題神器,牛人一對一服務,開發者編程必備官方網站:www.wenaaa.com

QQ群290551701 聚集很多互聯網精英,技術總監,架構師,項目經理!開源技術研究,歡迎業內人士,大牛及新手有志於從事IT行業人員進入!

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved