Android RecyclerView实现下拉刷新和上拉加载更多
程序员文章站
2023-12-19 17:33:58
使用官方的刷新控件swiperefreshlayout来实现下拉刷新,当recyclerview滑到底部实现下拉加载(进度条效果用recyclerview加载一个布局实现)...
使用官方的刷新控件swiperefreshlayout来实现下拉刷新,当recyclerview滑到底部实现下拉加载(进度条效果用recyclerview加载一个布局实现)
需要完成控件的下拉监听和上拉监听,其中,下拉监听通过swiprefreshlayout的setonrefreshlistener()方法监听,而上拉刷新,需要通过监听列表的滚动,当列表滚动到底部时触发事件,具体代码如下
主布局
<?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.swiperefreshlayout android:id="@+id/refresh_layout" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.recyclerview android:id="@+id/recycler_list" android:layout_width="match_parent" android:layout_height="match_parent"/> </android.support.v4.widget.swiperefreshlayout>
public class mainactivity extends appcompatactivity implements swiperefreshlayout.onrefreshlistener { private swiperefreshlayout refreshlayout; private recyclerview recyclerview; private linearlayoutmanager layoutmanager; private recycleradapter madapter; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); initviews(); } private void initviews() { refreshlayout = (swiperefreshlayout) findviewbyid(r.id.refresh_layout); recyclerview = (recyclerview) findviewbyid(r.id.recycler_list); layoutmanager = new linearlayoutmanager(this); refreshlayout.setcolorschemeresources(r.color.coloraccent, r.color.colorprimary);//设置刷新时进度条 颜色,最多四种 refreshlayout.setonrefreshlistener(this); madapter = new recycleradapter();//自定义的适配器 recyclerview.setadapter(madapter); recyclerview.setlayoutmanager(layoutmanager); recyclerview.addonscrolllistener(new onrecyclerscrolllistener()); } /** * 用于下拉刷新 */ @override public void onrefresh() { } /** * 用于上拉加载更多 */ public class onrecyclerscrolllistener extends recyclerview.onscrolllistener { int lastvisibleitem = 0; @override public void onscrollstatechanged(recyclerview recyclerview, int newstate) { super.onscrollstatechanged(recyclerview, newstate); if (madapter != null && newstate == recyclerview.scroll_state_idle && lastvisibleitem + 1 == madapter.getitemcount()) { //滚动到底部了,可以进行数据加载等操作 } } @override public void onscrolled(recyclerview recyclerview, int dx, int dy) { super.onscrolled(recyclerview, dx, dy); lastvisibleitem = layoutmanager.findlastvisibleitemposition(); } } }
下面是实现上拉时进度条转动的效果
item_list_footer.xml
<?xml version="1.0" encoding="utf-8"?> <relativelayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <textview android:id="@+id/tv_item_footer_load_more" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="16dp" android:gravity="center" android:text="上拉加载更多" /> <progressbar android:id="@+id/pb_item_footer_loading" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="16dp" android:visibility="gone"/> </relativelayout>
适配器
public class recycleradapter extends recyclerview.adapter<viewholder> { private static final int type_content = 0; private static final int type_footer = 1; private arraylist<databean> datalist; private progressbar pbloading; private textview tvloadmore; public recycleradapter() { datalist = new arraylist<>(); } @override public viewholder oncreateviewholder(viewgroup parent, int viewtype) { if (viewtype == type_content) { return new contentviewholder(layoutinflater.from(parent.getcontext()).inflate (r.layout.item_list_content, parent, false)); } else if (viewtype == type_footer) {//加载进度条的布局 return new footerviewholder(layoutinflater.from(parent.getcontext()).inflate (r.layout.item_list_footer, parent, false)); } return null; } @override public void onbindviewholder(viewholder holder, int position) { int type = getitemviewtype(position); if (type == type_content) { databean bean = datalist.get(position); ((contentviewholder) holder).tvid.settext("" + bean.getid()); ((contentviewholder) holder).tvname.settext(bean.getname()); } else if (type == type_footer) { pbloading = ((footerviewholder) holder).pbloading; tvloadmore = ((footerviewholder) holder).tvloadmore; } } /** * 获取数据集加上一个footer的数量 */ @override public int getitemcount() { return datalist.size() + 1; } @override public int getitemviewtype(int position) { if (position + 1 == getitemcount()) { return type_footer; } else { return type_content; } } /** * 获取数据集的大小 */ public int getlistsize() { return datalist.size(); } /** * 内容的viewholder */ public static class contentviewholder extends viewholder { private textview tvid, tvname; public contentviewholder(view itemview) { super(itemview); tvid = (textview) itemview.findviewbyid(r.id.tv_item_id); tvname = (textview) itemview.findviewbyid(r.id.tv_item_name); } } /** * footer的viewholder */ public static class footerviewholder extends viewholder { private textview tvloadmore; private progressbar pbloading; public footerviewholder(view itemview) { super(itemview); tvloadmore = (textview) itemview.findviewbyid(r.id.tv_item_footer_load_more); pbloading = (progressbar) itemview.findviewbyid(r.id.pb_item_footer_loading); } } /** * 显示正在加载的进度条,滑动到底部时,调用该方法,上拉就显示进度条,隐藏"上拉加载更多" */ public void showloading() { if (pbloading != null && tvloadmore != null) { pbloading.setvisibility(view.visible); tvloadmore.setvisibility(view.gone); } } /** * 显示上拉加载的文字,当数据加载完毕,调用该方法,隐藏进度条,显示“上拉加载更多” */ public void showloadmore() { if (pbloading != null && tvloadmore != null) { pbloading.setvisibility(view.gone); tvloadmore.setvisibility(view.visible); } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
Android RecyclerView实现下拉刷新和上拉加载更多
-
Android下拉刷新上拉加载更多左滑动删除
-
Android RecyclerView上拉加载和下拉刷新
-
Android RecyclerView上拉加载和下拉刷新(基础版)
-
ios基于MJRefresh实现上拉刷新和下拉加载动画效果
-
Android RecyclerView上拉加载更多功能回弹实现代码
-
Android之RecyclerView轻松实现下拉刷新和加载更多示例
-
Android RecyclerView实现下拉刷新和上拉加载更多
-
Android使用ListView实现下拉刷新及上拉显示更多的方法
-
android RecyclerView侧滑菜单,滑动删除,长按拖拽,下拉刷新上拉加载