当前位置: 移动技术网 > IT编程>移动开发>Android > Android RecyclerView实现下拉刷新和上拉加载更多

Android RecyclerView实现下拉刷新和上拉加载更多

2019年07月24日  | 移动技术网IT编程  | 我要评论

沉疴难起,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);
  }
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网