沉疴难起,lingsheng,湖北天门实验高中
使用官方的刷新控件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 studio 解决logcat无过滤工具栏的操作
Android Studio 恢复小窗口停靠模式(Docked Mode)
Android studio保存logcat日志到本地的操作
Android Studio快捷键生成TAG、Log.x日志输出介绍
网友评论