Android下拉刷新和上拉加载更多


下拉刷新

通过android系统提供的组件:SwipeRefreshLayout

一、基本使用
1 xml中 添加 SwipeRefreshLayout 组件
该组件包含着要操作下拉刷新的控件 如ListView RecyclerView 等
注意这里的SwipeRefreshLayout组件的子布局只能有一个

<android.support.v4.widget.SwipeRefreshLayoutandroid:id="@+id/swipe_refresh_layout"android:layout_below="@+id/dividerimage0"android:layout_width="match_parent"android:layout_height="match_parent"><android.support.v7.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent"></android.support.v7.widget.RecyclerView></android.support.v4.widget.SwipeRefreshLayout>

2 java代码中初始化

 private SwipeRefreshLayout swipeRefreshLayout;swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_layout);

3 设置刷新时的颜色变化

  swipeRefreshLayout.setColorSchemeResources(R.color.colorPrimary,R.color.green,R.color.red);

4 所在Activity类也要implements SwipeRefreshLayout.OnRefreshListener


5 重写下拉刷新方法

@Overridepublic void onRefresh() {// 网络请求okHttp.getHandler(handlerForGenJin);// 这里用sortWay变量 这样即使下拉刷新也能保持用户希望的排序方式askForOkHttp(sortWay);}

6 当网络请求完 获取并解析了数据,通知结束下拉刷新

  // 通知结束下拉刷新handlerForRefresh.sendEmptyMessage(0x93);

7

Handler handlerForRefresh = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case 0x93: {swipeRefreshLayout.setRefreshing(false);}}}};

8 开启监听
onCreate()中

swipeRefreshLayout.setOnRefreshListener(this);

问题:当下拉刷新后,会发现Item之间的间距增大,刷新一次增大一次
分析:因为你每次调用initView ,这样每次都会执行

  mRecyclerView.addItemDecoration(new MyDividerItemDecoration(this, DividerItemDecoration.VERTICAL));

也就是每次都会加一次分隔线,因此要设置一个boolean变量的值,判断是否是第一次加载界面,是的话就加分隔线,否则就不加分隔线了

 if (IsFirstOnCreate) {mRecyclerView.addItemDecoration(new MyDividerItemDecoration(this, DividerItemDecoration.VERTICAL));IsFirstOnCreate = false;}

从别的界面回传通知本界面执行下拉刷新
通过 intent 的 startActivityForResult方式去跳转 设置请求码回传码
在onActivityResult中:

    @Overridepublic void onActivityResult(int requestCode,int resultCode,Intent data){super.onActivityResult(requestCode,resultCode,data);if(requestCode==0x05){if(resultCode==0x05){swipeRefreshLayout.setOnRefreshListener(this);swipeRefreshLayout.post(new Runnable() {@Overridepublic void run() {swipeRefreshLayout.setRefreshing(true);}});this.onRefresh();}}}

上拉加载更多

主要是利用RecyclerView自带的ScrollListener去监听是否滑动到了底部

设置底部的Item样式

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"><TextView
        android:id="@+id/foot_tips"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:textSize="15sp"android:padding="10dp"android:layout_marginBottom="1dp"/></LinearLayout>

Activity中

    private LinearLayoutManager mLayoutManager;               private static boolean hasMore = false; // 是否有下一页private static int currentPage ;// 若是上拉加载更多的网络请求 则不需要删除数据private boolean isLoadingMore = false;// 最后一个条目位置private static int lastVisibleItem = 0;

oncreate中

loadingMore();
// 初始currentPage为1
currentPage = 1;
// 网络请求
askForOKHttp(sortWay);

loadingMore()监听方法:

private void loadingMore(){
// 实现上拉加载重要步骤,设置滑动监听器,RecyclerView自带的ScrollListener
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {@Overridepublic void onScrollStateChanged(RecyclerView recyclerView, int newState) {super.onScrollStateChanged(recyclerView, newState);if(!isLoadingMore){        // 若不是加载更多 才 加载// 在newState为滑到底部时if (newState == RecyclerView.SCROLL_STATE_IDLE) {// 如果没有隐藏footView,那么最后一个条目的位置(带数据)就比我们的getItemCount少1if (!mAdapter.isFadeTips() && lastVisibleItem + 1 == mAdapter.getItemCount()) {// 然后调用updateRecyclerview方法更新RecyclerViewupdateRecyclerView();}// 如果隐藏了提示条,我们又上拉加载时,那么最后一个条目(带数据)就要比getItemCount要少2if (mAdapter.isFadeTips() && lastVisibleItem + 2 == mAdapter.getItemCount()) {// 然后调用updateRecyclerview方法更新RecyclerViewupdateRecyclerView();    // 要调}}}  }//滚动监听@Overridepublic void onScrolled(RecyclerView recyclerView, int dx, int dy) {super.onScrolled(recyclerView, dx, dy);// 在滑动完成后,拿到最后一个可见的item的位置lastVisibleItem = mLayoutManager.findLastVisibleItemPosition();}});

mLayoutManager要为 LinearLayoutManager 类型的

  // 上拉加载时调用的更新RecyclerView的方法private void updateRecyclerView() {if(hasMore){// 还有下一页 网络请求 第二页 第三页currentPage++;    // 加1isLoadingMore = true;askForOKHttp(sortWay);}

Adapter中:
声明:

    private int normalType = 0;     // 第一种ViewType,正常的itemprivate int footType = 1;       // 第二种ViewType,底部的提示Viewprivate static boolean hasMore = true;   // 变量,是否有更多数据private boolean fadeTips = false; // 变量,是否隐藏了底部的提示

构造方法的形参 除了传入数据,增加一个hasMore变量 用于判断是否有更多

更新数据也是

    /***  更新数据 */public void updateData(ArrayList<String> array0,ArrayList<String> array1,ArrayList<String> array2,ArrayList<String> array3,boolean mHasMore) {this.arrayList0 = array0;  this.arrayList5 = array1;   this.arrayList2 = array2;   this.arrayList3 = array3;   hasMore = mHasMore;notifyDataSetChanged();}

onCreateViewHolder 中: 设置不同的viewHolder (分数据item和底部foot item)

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {if (viewType == normalType) {ViewHolder viewHolder = null;// 实例化展示的viewView v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_choose_customer, parent, false);// 实例化viewholderviewHolder = new ViewHolder(v, mItemClickListener);return viewHolder;}else {View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_foot_layout, parent, false);FootHolder footHolder = new FootHolder(v);return footHolder;}
}

onBindViewHolder中:

@Overridepublic void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {// 如果是正常的imte,直接设置TextView的值if (holder instanceof ViewHolder) {((ViewHolder) holder).customerName.setText(arrayList0.get(position));((ViewHolder) holder).qiangduo.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mItemInnerDeleteListener.onItemInnerDeleteClick(position);}});}else {if (hasMore) {// 不隐藏footView提示fadeTips = false;if (arrayList0.size() > 0) {// 如果查询数据发现增加之后,就显示正在加载更多((FootHolder) holder).tips.setVisibility(View.VISIBLE);((FootHolder) holder).tips.setText("正在加载更多...");}} else {if (arrayList0.size() > 0) {// 如果查询数据发现并没有增加时,就显示没有更多数据了((FootHolder) holder).tips.setText("暂无更多数据");// 然后通过主线程延时让这个提示消失,在1000ms后执行mHandler.postDelayed(new Runnable() {@Overridepublic void run() {// 隐藏提示条((FootHolder) holder).tips.setVisibility(View.GONE);// 将fadeTips设置truefadeTips = true;// hasMore设为true是为了让再次拉到底时,会先显示正在加载更多hasMore = true;}}, 1000);}}}}            
 @Overridepublic int getItemCount() {// 获取item的数量   计上footViewreturn arrayList0 == null ? 0 : arrayList0.size()+1;}// 自定义方法,获取数据的最后一个位置,不计上footViewpublic int getRealLastPosition() {return arrayList0.size();}
// 根据条目位置返回ViewType,以供onCreateViewHolder方法内获取不同的Holder@Overridepublic int getItemViewType(int position) {if (position == getItemCount() - 1) {return footType;} else {return normalType;}}
 // 暴露接口,改变fadeTips的方法public boolean isFadeTips() {return fadeTips;}
   // 正常item的ViewHolder,用以缓存findView操作class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{TextView XXX XXX XXX ;private MyItemClickListener mListener;......}
   // 底部footView的ViewHolder,用以缓存findView操作class FootHolder extends RecyclerView.ViewHolder {private TextView tips;FootHolder(View itemView) {super(itemView);tips = itemView.findViewById(R.id.foot_tips);}}

也可以使用第三方库实现上拉加载 下拉刷新

参考:https://github.com/scwang90/SmartRefreshLayout

上部和下部的会隐藏 然后下拉或者上拉 都会显示 然后过一定时间又会收回

和RecyclerView结合,则会有默认的一个 刷新样式

包括RecyclerView和其他组件,recyclerView控件上方/下方的组件 会作为 刷新的控件,设置控件的动画样式即为刷新或者加载的动画样式

只能设置3个子View 否则报错
Caused by: java.lang.RuntimeException: 最多只支持3个子View,Most only support three sub view
如:

<com.scwang.smartrefresh.layout.SmartRefreshLayoutandroid:id="@+id/smartRefresh"android:layout_width="match_parent"android:layout_height="match_parent"><ImageViewandroid:id="@+id/imageView0"android:layout_width="match_parent"android:layout_height="50dp"/><android.support.v7.widget.RecyclerViewandroid:layout_width="match_parent"android:layout_height="match_parent"></android.support.v7.widget.RecyclerView><com.scwang.smartrefresh.layout.footer.BallPulseFooterandroid:layout_width="match_parent"android:layout_height="50dp"/></com.scwang.smartrefresh.layout.SmartRefreshLayout>

待处理:限制下拉和上拉加载的高度限制


有三种添加的方式:

1 在 App extends Application的类中
static静态代码块中
优先级最低
2 在XML中

<com.scwang.smartrefresh.layout.SmartRefreshLayoutandroid:layout_width="match_parent"android:layout_height="match_parent">

使用 提供的 一些 好看的效果
如上方的

<com.scwang.smartrefresh.layout.footer.BallPulseFooter

也可以自己设置为自定义的 组件
如上方的

 <ImageView

java中开启帧动画

 ImageView imageView = findViewById(R.id.imageView0);imageView.setImageResource(R.drawable.run_animation_list);AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getDrawable();animationDrawable.start();

3 java代码设置

final RefreshLayout refreshLayout = (RefreshLayout) findViewById(R.id.refreshLayout);
//设置 Header 为 贝塞尔雷达 样式
refreshLayout.setRefreshHeader(new BezierRadarHeader(this).setEnableHorizontalDrag(true));
//设置 Footer 为 球脉冲 样式
refreshLayout.setRefreshFooter(new BallPulseFooter(this).setSpinnerStyle(SpinnerStyle.Scale));

Android下拉刷新和上拉加载更多相关推荐

  1. uni-app下拉刷新触底加载更多

    首先在pages.json 配置文件中配置    "enablePullDownRefresh": true  需要在哪用加载就配置在路由的style里 两个事件 //下拉刷新 o ...

  2. recyclerview的数据刷新(下拉刷新和自动加载更多)以及添加提示语(例如:“数据已加载完毕”)

    下拉加载更多的核心是SwipeRefreshLayout搭配Recyclerview进行使用.布局为 <android.support.v4.widget.SwipeRefreshLayout ...

  3. android--------自定义控件ListView实现下拉刷新和上拉加载

    开发项目过程中基本都会用到listView的下拉刷新和上滑加载更多,为了方便重写的ListView来实现下拉刷新,同时添加了上拉自动加载更多的功能. Android下拉刷新可以分为两种情况: 1.获取 ...

  4. Android 自定义 ListView 上下拉动“刷新最新”和“加载更多”歌曲列表

    本文内容 环境 测试数据 项目结构 演示 参考资料 本文演示,上拉刷新最新的歌曲列表,和下拉加载更多的歌曲列表.所谓"刷新最新"和"加载更多"是指日期.演示代码 ...

  5. android pulldown view,Android控件PullRefreshViewGroup实现下拉刷新和上拉加载

    本文实例为大家分享了Android实现下拉刷新和上拉加载更多的具体代码,供大家参考,具体内容如下 先分享下源码:Android实现下拉刷新和上拉加载更多 实现思路:由PullRefreshViewGr ...

  6. android 官方上拉,手把手教你实现RecyclerView的下拉刷新和上拉加载更多

    纵观多数App,下拉刷新和上拉加载更多是很常见的功能,但是谷歌官方只有一个SwipeRefreshLayout用来下拉刷新,上拉加载更多还要自己做. 基于RecyclerView简单封装了这两个操作, ...

  7. php mescroll,mescroll下拉刷新和上拉加载js框架

    插件描述:mescroll精致的下拉刷新和上拉加载js框架.原生js, 支持vue, 不依赖jquery, zepto, 比iScroll,dropload精简强大; 一套代码多端运行: 完美运行于a ...

  8. 使用SwipeRefreshLayout和RecyclerView实现仿“简书”下拉刷新和上拉加载更多

    原文地址: http://blog.csdn.net/leoleohan/article/details/50989549/ 一.概述 我们公司目前开发的所有Android APP都是遵循iOS风格设 ...

  9. 微信小程序下拉刷新和上拉加载

    效果图 微信小程序实现下拉刷新和上拉加载有2中方法 1 用系统自带的 个人感觉特别简单 2 使用scroll-view  实现, scroll-view 里面有2个属性是滑动到顶部以及到底部如下 其实 ...

最新文章

  1. mcs-51单片机视频教程——从硬件到c语言手把手的教,手把手从零教你学51单片机...
  2. java 二维数组
  3. infopath 小结
  4. MySQL忘记root密码--不重启mysqd重置root密码
  5. 【OpenCV学习笔记】【编程实例】一(VS2010/MFC+OPenCV2.4.7读取图片和摄像头)
  6. error: ‘nullptr’ was not declared in this scope
  7. RABBITMQ集群及HA、LB
  8. 挑战性题目DSCT102:木板切割问题
  9. anaconda利用sns或plt画图中文乱码问题
  10. 大前端课程学习心得体会+学习笔记
  11. Google Chrome谷歌浏览器清理缓存的常用方法
  12. 如何快速注册一个谷歌gmail邮箱(2021)
  13. homotopy-同伦_拔剑-浆糊的传说_新浪博客
  14. 开发简单Android聊天软件(1)
  15. 笔记本合上盖子就断网怎么办?
  16. python解包wxapkg_小程序反编译之获取wxapkg包
  17. Layui的eleTree树式选择器使用
  18. Windows配置SSHKey到GItHub
  19. 如何免费安装并激活序列号iMazing软件
  20. (HEBUT)机械原理课程设计——自动打印机

热门文章

  1. ssm+java计算机毕业设计公交路线查询系统l1auz(程序+lw+源码+远程部署)
  2. 拷机测试需要多久_网站建设要多久?
  3. 小猪的Python学习之旅 —— 1.基础知识储备
  4. java文件写入不覆盖_java写入文件不覆盖写入_Java写入文件–用Java写入文件的4种方法...
  5. {“error“:“incorrect region, please use up-z1.qiniup.com“}
  6. PS 去除图片中的字
  7. 2000元 组装车 思路
  8. win10专业版变远程服务器
  9. 数字媒体技术考点整理
  10. 【学习笔记】产品经理必备技能之数据分析(二)常见数据分析方法(上)