一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Android RecyclerView上拉加载和下拉刷新

时间:2017-03-24 编辑:简简单单 来源:一聚教程网

代码中注释的很详细,所以就直接上代码了。

核心实现

 代码如下 复制代码

packagecom.example.fly.recyclerviewrefresh.base;

 

importandroid.os.Bundle;

importandroid.support.annotation.Nullable;

importandroid.support.v4.widget.SwipeRefreshLayout;

importandroid.support.v7.widget.LinearLayoutManager;

importandroid.support.v7.widget.RecyclerView;

importcom.example.fly.recyclerviewrefresh.R;

importjava.util.ArrayList;

importjava.util.List;

 

/**

 * 类名:

 * 类描述:下拉刷新和上拉加载

 * 创建人:fly

 * 创建日期: 2017/2/2.

 * 版本:V1.0

 */

publicabstractclassRefreshActivityextendsBaseActivityimplementsSwipeRefreshLayout.OnRefreshListener {

 protectedSwipeRefreshLayout swipeRefreshLayout;

 protectedRecyclerView recyclerView;

 protectedLinearLayoutManager linearLayoutManager;

 protectedA adapter;

 protectedList lists =newArrayList<>();

 protectedT dataBeanLoadMore = createBean();

 protectedbooleanisLoadDataIng;// 默认为false 是否正在加载数据, false 不在加载, true 正在加载

 protectedbooleanisScrollY;// 是否在Y轴(垂直方向)上滑动, false 没滑动, true 滑动

 

 @Override

 protectedvoidonCreate(@NullableBundle savedInstanceState) {

 super.onCreate(savedInstanceState);

 setContentView(setLayout());

 swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout);

 swipeRefreshLayout.setOnRefreshListener(this);

 swipeRefreshLayout.setColorSchemeResources(Refresh.colors);// 设置变化的颜色

 recyclerView = (RecyclerView) findViewById(R.id.recyclerView);

 linearLayoutManager =newLinearLayoutManager(this);

 recyclerView.setLayoutManager(linearLayoutManager);

 loadMore();

 }

 

 /**作用就是能在父类中初始化公共的控件如上面的onCreate(@Nullable Bundle savedInstanceState)初始化的控件*/

 protectedabstractintsetLayout();

 

 publicabstractT createBean();

 

// public abstract A createAdapter();

 

 /**上拉加载*/

 protectedvoidloadMore() {

 recyclerView.addOnScrollListener(newRecyclerView.OnScrollListener() {

 

 /**

 *

 * @param recyclerView 当前在滚动的RecyclerView

 * @param newState 当前滚动状态

 *  newState有三种值:

 //静止,没有滚动

 public static final int SCROLL_STATE_IDLE = 0;

 

 //正在被外部拖拽,一般为用户正在用手指滚动

 public static final int SCROLL_STATE_DRAGGING = 1;

 

 //自动滚动开始

 public static final int SCROLL_STATE_SETTLING = 2;

 */

 @Override

 publicvoidonScrollStateChanged(RecyclerView recyclerView,intnewState) {

 super.onScrollStateChanged(recyclerView, newState);

 if(newState == RecyclerView.SCROLL_STATE_IDLE && isLoadDataIng ==false) {

  intlastVisibleItem = linearLayoutManager.findLastCompletelyVisibleItemPosition();// 获取最后一个item的角标

  inttotalItemCount = linearLayoutManager.getItemCount();// 获取item的总数

  if(lastVisibleItem == (totalItemCount -1)) {// 判断滑到最后一个item

  if(!swipeRefreshLayout.isRefreshing()) {//不再下拉刷新状态

  if(isScrollY) {// 在Y轴(垂直方向)上有滑动

  // TODO 执行上拉加载

  onShowRefresh();

  loadMoreData();

  }

  }

  }

 }

 }

 

 /**

 *

 * @param recyclerView 当前滚动的view

 * @param dx 水平滚动距离

 * @param dy 垂直滚动距离

 */

 @Override

 publicvoidonScrolled(RecyclerView recyclerView,intdx,intdy) {

 super.onScrolled(recyclerView, dx, dy);

 if(dy >0) {

  isScrollY =true;

 }else{

  isScrollY =false;

 }

 }

 });

 }

 

 /**加载数据*/

 publicabstractvoidloadMoreData();

 

 /**显示加在更多的View*/

 protectedvoidonShowRefresh() {

 isLoadDataIng =true;// 正在加载数据

 lists.add(dataBeanLoadMore);

 adapter.notifyDataSetChanged();

 }

 

 /**隐藏加在更多的View*/

 protectedvoidonHintLoadMore() {

 lists.remove(dataBeanLoadMore);

 isLoadDataIng =false;// 不在加载数据

 adapter.notifyDataSetChanged();

 }

}

 代码如下 复制代码

packagecom.example.fly.recyclerviewrefresh;

 

importandroid.os.Handler;

importandroid.os.Bundle;

importcom.example.fly.recyclerviewrefresh.adapter.RecyclerAdapter;

importcom.example.fly.recyclerviewrefresh.base.Refresh;

importcom.example.fly.recyclerviewrefresh.base.RefreshActivity;

importcom.example.fly.recyclerviewrefresh.bean.DataBean;

 

/**

 * 类名:

 * 类描述:RecyclerView刷新 方法二

 * 创建人:fly

 * 创建日期: 2017/2/2.

 * 版本:V1.0

 */

publicclassMainActivityextendsRefreshActivity{

 

 @Override

 protectedvoidonCreate(Bundle savedInstanceState) {

 super.onCreate(savedInstanceState);

 for(inti =0; i <20; i++) {

 DataBean dataBean =newDataBean(Refresh.COMMON);

 dataBean.number = String.valueOf(i);

 lists.add(dataBean);

 }

 adapter =newRecyclerAdapter(lists,this);

 recyclerView.setAdapter(adapter);

 }

 

 @Override

 publicvoidonRefresh() {

 newHandler().postDelayed(newRunnable() {

 @Override

 publicvoidrun() {

 lists.clear();

 adapter.notifyDataSetChanged();

 swipeRefreshLayout.setRefreshing(false);

 }

 },1000);

 }

 

 @Override

 protectedintsetLayout() {returnR.layout.activity_main;}

 

 @Override

 publicDataBean createBean() {returnnewDataBean(Refresh.LOAD_MORE);}

 

 @Override

 publicvoidloadMoreData() {

 for(inti =0; i <5; i++) {

 DataBean dataBean =newDataBean(Refresh.COMMON);

 dataBean.number = String.valueOf(i) +"fly";

 lists.add(dataBean);

 }

 adapter.notifyDataSetChanged();

 onHintLoadMore();

 }

}

源码下载:RecyclerViewRefresh刷新加载

热门栏目