让RecyclerView上拉刷新下拉加载更多更简便易用

ElenaMacken 8年前
   <h3><strong>效果图</strong></h3>    <p style="text-align:center"><img src="https://simg.open-open.com/show/c4cd91773a43642ad0bfa05fe8c19e32.gif"></p>    <p style="text-align:center">dd.gif</p>    <h3><strong>说明</strong></h3>    <p>1.本demo使用的数据,均由gank.io提供</p>    <p>2.下拉刷新使用的是SwipeRefreshLayout</p>    <p>3.上拉加载更多使用的是BRVAH提供的BaseRecyclerViewAdapterHelper:2.1.3</p>    <h3><strong>抽取接口</strong></h3>    <pre>  <code class="language-java">public interface IPagingService<T extends List> {      /**       * 加载分页数据       * @param page 加载第几页       * @param limit 1页加载多少条       */      void getData(int page,int limit, Observer<T> observer);  }</code></pre>    <h3><strong>编写基类(实现分页逻辑)</strong></h3>    <pre>  <code class="language-java">public class BasePagingActivity<T> extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener, BaseQuickAdapter.RequestLoadMoreListener {      private static final int PAGE_SIZE = 20;      private RecyclerView mRecyclerView;      private BaseQuickAdapter mQuickAdapter;      private IPagingService<List<T>> mPagingService;      private SwipeRefreshLayout mSwipeRefreshLayout;      private int currentPage;      private int lastPage;        private void setSwipeRefreshLayout(SwipeRefreshLayout swipeRefreshLayout) {          if (swipeRefreshLayout != null) {              mSwipeRefreshLayout = swipeRefreshLayout;              mSwipeRefreshLayout.setProgressBackgroundColorSchemeResource(android.R.color.white);              mSwipeRefreshLayout.setProgressViewOffset(false, 0, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 24, getResources().getDisplayMetrics()));              mSwipeRefreshLayout.setColorSchemeResources(android.R.color.holo_blue_light, android.R.color.holo_red_light, android.R.color.holo_orange_light, android.R.color.holo_green_light);              swipeRefreshLayout.setOnRefreshListener(this);          } else {              throw new NullPointerException("swipeRefreshLayout not null");          }      }        private void setRecyclerView(RecyclerView recyclerView) {          mRecyclerView = recyclerView;          if (mRecyclerView.getLayoutManager() == null) {              mRecyclerView.setLayoutManager(new LinearLayoutManager(this));          }      }        private void setQuickAdapter(BaseQuickAdapter quickAdapter) {          if (quickAdapter != null) {              mQuickAdapter = quickAdapter;              mQuickAdapter.openLoadAnimation();              mQuickAdapter.openLoadMore(PAGE_SIZE);              mQuickAdapter.setOnLoadMoreListener(this);              mRecyclerView.setAdapter(quickAdapter);          } else {              throw new NullPointerException("swipeRefreshLayout not null");          }      }        /**      * 开始获取数据,提供给子类调用      */      protected void startGetData(RecyclerView recyclerView,SwipeRefreshLayout swipeRefreshLayout,BaseQuickAdapter quickAdapter, IPagingService<List<T>> pagingService){          mPagingService = pagingService;          setRecyclerView(recyclerView);          setSwipeRefreshLayout(swipeRefreshLayout);          setQuickAdapter(quickAdapter);          onLoadFirstData();      }        @Override      public void onRefresh() {          currentPage = 1;          mPagingService.getData(currentPage, PAGE_SIZE, new Observer<List<T>>() {              @Override              public void onCompleted() {                }                @Override              public void onError(Throwable e) {                  Toast.makeText(BasePagingActivity.this,e.getMessage(),Toast.LENGTH_SHORT).show();                  mSwipeRefreshLayout.setRefreshing(false);                  currentPage = lastPage;              }                @Override              public void onNext(List<T> list) {                  if (list == null) return;                  mQuickAdapter.getData().clear();                  mQuickAdapter.addData(list);                  mQuickAdapter.notifyDataSetChanged();                  mSwipeRefreshLayout.setRefreshing(false);              }          });      }        @Override      public void onLoadMoreRequested() {          lastPage = currentPage;          currentPage++;          mPagingService.getData(currentPage, PAGE_SIZE, new Observer<List<T>>() {              @Override              public void onCompleted() {                }                @Override              public void onError(Throwable e) {                  Toast.makeText(BasePagingActivity.this,e.getMessage(),Toast.LENGTH_SHORT).show();                  currentPage = lastPage;              }                @Override              public void onNext(List<T> list) {                  if ((list != null && list.isEmpty())) {                      Toast.makeText(BasePagingActivity.this,"没有更多数据了",Toast.LENGTH_SHORT).show();                      mQuickAdapter.addData(list);                      mQuickAdapter.loadComplete();                  } else {                      mQuickAdapter.addData(list);                  }                  lastPage = currentPage;              }          });      }        public void onLoadFirstData(){          lastPage = currentPage = 1;          mSwipeRefreshLayout.setRefreshing(true);          mPagingService.getData(currentPage, PAGE_SIZE, new Observer<List<T>>() {              @Override              public void onCompleted() {                }                @Override              public void onError(Throwable e) {                  Toast.makeText(BasePagingActivity.this,e.getMessage(),Toast.LENGTH_SHORT).show();                  mSwipeRefreshLayout.setRefreshing(false);              }                @Override              public void onNext(List<T> list) {                  if (list == null) return;                  mQuickAdapter.addData(list);                  mQuickAdapter.notifyDataSetChanged();                  mSwipeRefreshLayout.setRefreshing(false);              }          });      }  }</code></pre>    <p>fragment同样可以这样做</p>    <h3><strong>使用</strong></h3>    <p>1.实现IPagingService</p>    <pre>  <code class="language-java">public class WelfareServer implements IPagingService<List<WelfareEntity>>{          @Override          public void getData(int page, int limit, Observer<List<WelfareEntity>> observer) {              RetrofitManager.getInstance().createReq(GankIo.class)                      .getWelfareImg(limit, page)                      .subscribeOn(Schedulers.io())                      .observeOn(AndroidSchedulers.mainThread())                      .subscribe(observer);          }      }</code></pre>    <h3>2.继承BasePagingActivity并调用startGetData方法</h3>    <pre>  <code class="language-java">public class MainActivity extends BasePagingActivity<WelfareEntity> {        @Override      protected void onCreate(Bundle savedInstanceState) {          super.onCreate(savedInstanceState);          setContentView(R.layout.activity_main);            SwipeRefreshLayout mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.refresh_layout);          RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.list);          startGetData(mRecyclerView, mSwipeRefreshLayout, new BaseQuickAdapter<WelfareEntity>(R.layout.item_welfare,new ArrayList()){              @Override              protected void convert(BaseViewHolder baseViewHolder, WelfareEntity welfareEntity) {                  Glide.with(MainActivity.this)                          .load(welfareEntity.getUrl())                          .placeholder(R.mipmap.load_image_bg)                          .into((ImageView) baseViewHolder.getView(R.id.iv));              }          },new WelfareServer());        }  }</code></pre>    <p> </p>    <p> </p>    <p>来自:http://www.jianshu.com/p/f3c3a84c2e99</p>    <p> </p>