打造自己的下拉刷新+上滑加載框架

前言

下拉刷新與上滑加載作為經典的交互動作,幾乎已經成了各大App的標配。Google也是在support包中加入了SwipeRefreshLayout, 一個符合MaterialDesign規范的下拉刷新布局。美中不足的是該布局不支持上滑加載更多。GitHub上面有不少直接擴展ListView或者RecyclerView的例子,但我覺得刷新布局還是應該作為內容視圖的父控件,并且同時支持ListView和RecyclerView會更加方便。因此自己動手寫了一個輪子——RefreshLoadLayout

  • 既支持上滑加載又支持下拉刷新
  • 下拉刷新支持幾乎所有View,并且可以通過設置回調來判斷內容視圖是否還能繼續上滑/下滑。而上滑加載由于要考慮Fling,目前只做了AbsListView和RecyclerView的適配,相信已經可以滿足絕大多數加載更多的需求。
  • 支持NestedScrolling機制
demo

使用介紹

  • 添加 gralde 依賴
    **compile 'com.github.refreshloadlayout:refreshloadlayout:0.0.4' **
    如果收到支持庫不統一的警告,可修改為 compile ('com.github.refreshloadlayout:refreshloadlayout:0.0.4'){exclude group: 'com.android.support'}

  • 在布局中使用
    <com.github.refreshloadlayout.RefreshLoadLayout
    android:id="@+id/refreshLayout"
    app:loadingEnabled="true"
    app:refreshingEnabled="true"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ListView
    android:id="@+id/listView"
    android:background="#fff"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
    </com.github.refreshloadlayout.RefreshLoadLayout>

  • 下拉刷新

    refreshLoadLayout.setOnRefreshListener(new RefreshLoadLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            refreshLoadLayout.postDelayed(new Runnable() {
                @Override
                public void run() {
                    refreshLoadLayout.endRefreshing();
                }
            }, 3000);
        }
    });
  • 上滑加載

      refreshLoadLayout.setLoadingHandler(new RefreshLoadLayout.LoadingHandler() {
          @Override
          public boolean canLoadMore() {
              return listView.getCount()<26;
          }
    
          @Override
          public void onLoading() {
              refreshLoadLayout.postDelayed(new Runnable() {
                  @Override
                  public void run() {
                      ArrayAdapter<String> arrayAdapter= (ArrayAdapter<String>) listView.getAdapter();
                      arrayAdapter.add("a new data");
                      arrayAdapter.add("a new data");
                      refreshLoadLayout.endLoading();
                  }
              }, 2000);
    
          }
      });
    

其中 canLoadMore() 方法返回當前是否可以進行加載,即是否還有更多內容。
可設置是否需要在加載結束后將內容視圖下滑一定距離,默認開啟:
refreshLoadLayout.setScrollDownAfterLoading(false);

  • 啟用/關閉功能
    默認開啟下拉刷新關閉上滑加載更多,可以在xml中指定或者在代碼中修改。
    refreshLoadLayout.setRefreshingEnabled(false);
    refreshLoadLayout.setLoadingEnabled(true);

  • UI定制
    目前共有兩種指示器顯示效果,默認實現的是仿新浪微博的,還有一種是Material 效果。
    首先可以通過 refreshLoadLayout.getRefreshIndicator();refreshLoadLayout.getLoadMoreIndicator(); 獲取當前的指示器控件。進而對提示文字與背景顏色等調整。
    同時支持擴展 RefreshIndicatorLoadMoreIndicator 接口來打造自己的指示器,在相應的回調中更新視圖達到理想的效果。之后可將指示器設置為自定義的View。
    比如設置 Material 效果的指示器:
    MaterialIndicator materialIndicator=new MaterialIndicator(this);
    materialIndicator.getProgressView().setColorSchemeColors(Color.RED,Color.YELLOW);
    refreshLoadLayout.setRefreshIndicator(materialIndicator);

總結

使用上總體還是比較簡單的,有需要的朋友可以添加到自己的項目中試試。項目已開源至 GitHub, 有問題歡迎提issue,我會盡快處理。如果對你有幫助,還請右上角star :)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容