Android下拉刷新和上拉加载更多
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下拉刷新和上拉加载更多相关推荐
- uni-app下拉刷新触底加载更多
首先在pages.json 配置文件中配置 "enablePullDownRefresh": true 需要在哪用加载就配置在路由的style里 两个事件 //下拉刷新 o ...
- recyclerview的数据刷新(下拉刷新和自动加载更多)以及添加提示语(例如:“数据已加载完毕”)
下拉加载更多的核心是SwipeRefreshLayout搭配Recyclerview进行使用.布局为 <android.support.v4.widget.SwipeRefreshLayout ...
- android--------自定义控件ListView实现下拉刷新和上拉加载
开发项目过程中基本都会用到listView的下拉刷新和上滑加载更多,为了方便重写的ListView来实现下拉刷新,同时添加了上拉自动加载更多的功能. Android下拉刷新可以分为两种情况: 1.获取 ...
- Android 自定义 ListView 上下拉动“刷新最新”和“加载更多”歌曲列表
本文内容 环境 测试数据 项目结构 演示 参考资料 本文演示,上拉刷新最新的歌曲列表,和下拉加载更多的歌曲列表.所谓"刷新最新"和"加载更多"是指日期.演示代码 ...
- android pulldown view,Android控件PullRefreshViewGroup实现下拉刷新和上拉加载
本文实例为大家分享了Android实现下拉刷新和上拉加载更多的具体代码,供大家参考,具体内容如下 先分享下源码:Android实现下拉刷新和上拉加载更多 实现思路:由PullRefreshViewGr ...
- android 官方上拉,手把手教你实现RecyclerView的下拉刷新和上拉加载更多
纵观多数App,下拉刷新和上拉加载更多是很常见的功能,但是谷歌官方只有一个SwipeRefreshLayout用来下拉刷新,上拉加载更多还要自己做. 基于RecyclerView简单封装了这两个操作, ...
- php mescroll,mescroll下拉刷新和上拉加载js框架
插件描述:mescroll精致的下拉刷新和上拉加载js框架.原生js, 支持vue, 不依赖jquery, zepto, 比iScroll,dropload精简强大; 一套代码多端运行: 完美运行于a ...
- 使用SwipeRefreshLayout和RecyclerView实现仿“简书”下拉刷新和上拉加载更多
原文地址: http://blog.csdn.net/leoleohan/article/details/50989549/ 一.概述 我们公司目前开发的所有Android APP都是遵循iOS风格设 ...
- 微信小程序下拉刷新和上拉加载
效果图 微信小程序实现下拉刷新和上拉加载有2中方法 1 用系统自带的 个人感觉特别简单 2 使用scroll-view 实现, scroll-view 里面有2个属性是滑动到顶部以及到底部如下 其实 ...
最新文章
- mcs-51单片机视频教程——从硬件到c语言手把手的教,手把手从零教你学51单片机...
- java 二维数组
- infopath 小结
- MySQL忘记root密码--不重启mysqd重置root密码
- 【OpenCV学习笔记】【编程实例】一(VS2010/MFC+OPenCV2.4.7读取图片和摄像头)
- error: ‘nullptr’ was not declared in this scope
- RABBITMQ集群及HA、LB
- 挑战性题目DSCT102:木板切割问题
- anaconda利用sns或plt画图中文乱码问题
- 大前端课程学习心得体会+学习笔记
- Google Chrome谷歌浏览器清理缓存的常用方法
- 如何快速注册一个谷歌gmail邮箱(2021)
- homotopy-同伦_拔剑-浆糊的传说_新浪博客
- 开发简单Android聊天软件(1)
- 笔记本合上盖子就断网怎么办?
- python解包wxapkg_小程序反编译之获取wxapkg包
- Layui的eleTree树式选择器使用
- Windows配置SSHKey到GItHub
- 如何免费安装并激活序列号iMazing软件
- (HEBUT)机械原理课程设计——自动打印机
热门文章
- ssm+java计算机毕业设计公交路线查询系统l1auz(程序+lw+源码+远程部署)
- 拷机测试需要多久_网站建设要多久?
- 小猪的Python学习之旅 —— 1.基础知识储备
- java文件写入不覆盖_java写入文件不覆盖写入_Java写入文件–用Java写入文件的4种方法...
- {“error“:“incorrect region, please use up-z1.qiniup.com“}
- PS 去除图片中的字
- 2000元 组装车 思路
- win10专业版变远程服务器
- 数字媒体技术考点整理
- 【学习笔记】产品经理必备技能之数据分析(二)常见数据分析方法(上)