Android RecyclerView上拉加载和下拉刷新
之前写过一篇刷新加载《RecyclerView上拉加载和下拉刷新(基础版)》,这次是进行改装完善。
代码中注释的很详细,所以就直接上代码了。
核心实现
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
*/
publicabstractclassRefreshActivity<TextendsObject,AextendsRecyclerView.Adapter>extendsBaseActivityimplementsSwipeRefreshLayout.OnRefreshListener{
protectedSwipeRefreshLayoutswipeRefreshLayout;
protectedRecyclerViewrecyclerView;
protectedLinearLayoutManagerlinearLayoutManager;
protectedAadapter;
protectedList<T>lists=newArrayList<>();
protectedTdataBeanLoadMore=createBean();
protectedbooleanisLoadDataIng;//默认为false是否正在加载数据,false不在加载,true正在加载
protectedbooleanisScrollY;//是否在Y轴(垂直方向)上滑动,false没滑动,true滑动
@Override
protectedvoidonCreate(@NullableBundlesavedInstanceState){
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(@NullableBundlesavedInstanceState)初始化的控件*/
protectedabstractintsetLayout();
publicabstractTcreateBean();
//publicabstractAcreateAdapter();
/**上拉加载*/
protectedvoidloadMore(){
recyclerView.addOnScrollListener(newRecyclerView.OnScrollListener(){
/**
*
*@paramrecyclerView当前在滚动的RecyclerView
*@paramnewState当前滚动状态
*newState有三种值:
//静止,没有滚动
publicstaticfinalintSCROLL_STATE_IDLE=0;
//正在被外部拖拽,一般为用户正在用手指滚动
publicstaticfinalintSCROLL_STATE_DRAGGING=1;
//自动滚动开始
publicstaticfinalintSCROLL_STATE_SETTLING=2;
*/
@Override
publicvoidonScrollStateChanged(RecyclerViewrecyclerView,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();
}
}
}
}
}
/**
*
*@paramrecyclerView当前滚动的view
*@paramdx水平滚动距离
*@paramdy垂直滚动距离
*/
@Override
publicvoidonScrolled(RecyclerViewrecyclerView,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<DataBean,RecyclerAdapter>{
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
for(inti=0;i<20;i++){
DataBeandataBean=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
publicDataBeancreateBean(){returnnewDataBean(Refresh.LOAD_MORE);}
@Override
publicvoidloadMoreData(){
for(inti=0;i<5;i++){
DataBeandataBean=newDataBean(Refresh.COMMON);
dataBean.number=String.valueOf(i)+"fly";
lists.add(dataBean);
}
adapter.notifyDataSetChanged();
onHintLoadMore();
}
}
源码下载:RecyclerViewRefresh刷新加载
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。