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刷新加载
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。