android SwipeRefreshLayout 增加上拉加载更多
2019独角兽企业重金招聘Python工程师标准>>>
大家可能有的没有swipeRefreshLayout这个类,简单说一下,这是v4包里面的,19.1版本的时候就有了,但是当时的样式还是几个横杠,大概在21.0后吧,已经是我这个demo这样了。。挺好看的。一个圆形进度条.所以大家在使用时,请先升级一下自己的v4包,另外大家可能android support library已经是19.1以上了,还是没有,大家要注意一下,上面的Android Support Repository。更新到最新版本
1,继承SwipeRefreshLayout,自定义一个view VRefresh
package demo.veidy.com.veidydemolist;
import android.content.Context;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.AbsListView;
import android.widget.ListView;/*** Created by veidy on 2015/1/16.*/
public class VRefresh extends SwipeRefreshLayout implements AbsListView.OnScrollListener {/*** 滑动到最下面时的上拉操作*/private int mTouchSlop;/*** listview实例*/private ListView mListView;/*** RecyclerView 实例*/private RecyclerView recyclerView;/*** 上拉监听器, 到了最底部的上拉加载操作*/private OnLoadListener mOnLoadListener;/*** ListView的加载中footer*/private View mFooterView;/*** 按下时的y坐标*/private int mYDown;/*** 抬起时的y坐标, 与mYDown一起用于滑动到底部时判断是上拉还是下拉*/
// private int mLastY;/*** 是否在加载中 ( 上拉加载更多 )*/private boolean isLoading = false;private float mLastY = -1;/*** 最后一行*/boolean isLastRow = false;/*** 是否还有数据可以加载*/private boolean moreData = true;public VRefresh(Context context) {super(context);}public VRefresh(Context context, AttributeSet attrs) {super(context, attrs);mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();mFooterView = LayoutInflater.from(context).inflate(R.layout.vrefresh_footer, null, false);}/*** 设置默认的childview-必须要设置** @param context* @param childView*/public void setView(Context context, View childView) {if (childView instanceof ListView) {mListView = (ListView) childView;// 设置滚动监听器给ListView, 使得滚动的情况下也可以自动加载mListView.setOnScrollListener(this);mListView.setFooterDividersEnabled(false);Log.d("VRefresh", "获取到listview");} else if (childView instanceof RecyclerView) {recyclerView = (RecyclerView) childView;// 设置滚动监听器给ListView, 使得滚动的情况下也可以自动加载recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {@Overridepublic void onScrollStateChanged(RecyclerView recyclerView, int newState) {super.onScrollStateChanged(recyclerView, newState);}@Overridepublic void onScrolled(RecyclerView recyclerView, int dx, int dy) {super.onScrolled(recyclerView, dx, dy);Log.d("VRefresh", "dx=" + dx + "---dy=" + dy);}});Log.d("VRefresh", "获取到recyclerView");}initWithContext(context);}private void initWithContext(Context context) {if (mListView != null)mListView.addFooterView(mFooterView, null, false);//设置footview不可点击
// if (recyclerView!=null){
// Log.d("VRefresh","快去自定义recyclerView 加footview吧");
// return;
// }mFooterView.setVisibility(View.GONE);//默认先隐藏}@Overrideprotected void onLayout(boolean changed, int left, int top, int right, int bottom) {super.onLayout(changed, left, top, right, bottom);}/*** 是否可以加载更多, listview不在加载中, 且为上拉操作.** @param canload 是否还有可以加载的数据* @return*/private boolean canLoad(boolean canload) {return canload && !isLoading && isPullUp();}/*** 判断是否到了最底部*/private boolean isBottom() {if (mListView != null && mListView.getAdapter() != null) {return mListView.getLastVisiblePosition() == (mListView.getAdapter().getCount() - 1);}return false;}/*** 是否是上拉操作** @return*/private boolean isPullUp() {Log.d("VRefresh", "isPullUp--->");return (mYDown - mLastY) >= mTouchSlop;}/*** 如果到了最底部,而且是上拉操作.onLoadMore*/private void loadData() {Log.d("VRefresh", "loadData--->");if (mOnLoadListener != null) {// 设置状态setLoading(true);mOnLoadListener.onLoadMore();}}/*** @param loading*/public void setLoading(boolean loading) {isLoading = loading;if (isLoading) {
// mListView.addFooterView(mFooterView);mFooterView.setVisibility(View.VISIBLE);} else {
// mListView.removeFooterView(mFooterView);mFooterView.setVisibility(View.GONE);mYDown = 0;mLastY = 0;}}/** (non-Javadoc)* @see android.view.ViewGroup#dispatchTouchEvent(android.view.MotionEvent)*/@Overridepublic boolean dispatchTouchEvent(MotionEvent event) {final int action = event.getAction();if (mLastY == -1) {mLastY = (int) event.getRawY();}switch (action) {case MotionEvent.ACTION_DOWN:// 按下mYDown = (int) event.getRawY();Log.d("VRefresh", "按下");break;case MotionEvent.ACTION_MOVE:// 移动mLastY = (int) event.getRawY();final float deltaY = event.getRawY() - mLastY;Log.d("VRefresh", "移动");
// if (null != mListView && isPullUp()) {
// if (mListView.getLastVisiblePosition() == mTotalItemCount - 1 || deltaY < 0) {
// mListView.setSelection(mTotalItemCount - 1);
// }
// }break;default:
// if (isLastRow && canLoad(moreData)) {
// Log.d("VRefresh", "能加载...");
// loadData();
// } else {
// Log.d("VRefresh", "不能加载...");
// }break;}return super.dispatchTouchEvent(event);}@Overridepublic void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);}/*** @param loadListener*/public void setOnLoadListener(OnLoadListener loadListener) {mOnLoadListener = loadListener;}@Overridepublic void onScrollStateChanged(AbsListView absListView, int i) {}@Overridepublic void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {//判断是否滚到最后一行if (firstVisibleItem + visibleItemCount == totalItemCount && totalItemCount > 0) {//双重判断,应该没有必要if (absListView.getLastVisiblePosition() == (absListView.getAdapter().getCount() - 1)) {isLastRow = true;
// mFooterView.setVisibility(View.VISIBLE);if (canLoad(moreData)) {Log.d("VRefresh", "滚动到最后一行,加载数据,显示footview");loadData();}}Log.d("VRefresh", "滚动到最后一行");} else {Log.d("VRefresh", "没有滚动到最后一行");isLastRow = false;}}public static interface OnLoadListener {public void onLoadMore();}public boolean isMoreData() {return moreData;}public void setMoreData(boolean moreData) {this.moreData = moreData;}
}
2.创建一个activity--SwipeRefreshDemo,创建activity之前,创建一个xml布局,直接引用自定义控制
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"android:paddingBottom="@dimen/activity_vertical_margin"><demo.veidy.com.veidydemolist.VRefreshandroid:id="@+id/swiperefreshlayou"android:layout_width="match_parent"android:layout_height="match_parent"><ListViewandroid:id="@+id/lv"android:layout_width="match_parent"android:layout_height="match_parent"></ListView></demo.veidy.com.veidydemolist.VRefresh>
</RelativeLayout>
3,在activity里面进行设置-核心代码
@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_swipe_refresh_layout_view);initialize();for (int i = 0; i < 2; i++) {A a = new A();a.setDescribe("----" + i);bean.add(a);}//进度条颜色swiperefreshlayou.setColorSchemeResources(android.R.color.holo_red_light,android.R.color.holo_green_light, android.R.color.holo_blue_bright, android.R.color.holo_orange_light);
// swiperefreshlayou.setProgressBackgroundColor(getResources().getColor(android.R.color.holo_red_light));swiperefreshlayou.setSize(0);//0和1 圆形进度条两种不同效果 0刚开始有渲染效果myAdapter = new MyAdapter(bean, this);//listview adapterswiperefreshlayou.setView(this, lv);//设置嵌套的子view -listviewswiperefreshlayou.setMoreData(false);//设置是否还有数据可加载(一般根据服务器反回来决定)lv.setAdapter(myAdapter);swiperefreshlayou.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {@Overridepublic void onRefresh() {Message msg = mhandler.obtainMessage();msg.what = REFRESH_COMPLETE;mhandler.sendMessageDelayed(msg, 3000);//3秒后通知停止刷新}});swiperefreshlayou.setOnLoadListener(new VRefresh.OnLoadListener() {@Overridepublic void onLoadMore() {Message msg = mhandler.obtainMessage();msg.what = LOADMORE_COMPLETE;mhandler.sendMessageDelayed(msg, 3000);//3秒后通知停止加载更多}});}
加载完成后去handle更新
private static final int REFRESH_COMPLETE = 0;//刷新完成标识private static final int LOADMORE_COMPLETE = 1;//加载更多完成标识Handler mhandler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what) {case LOADMORE_COMPLETE:for (int i = 0; i < 5; i++) {A a = new A();a.setDescribe("----" + i);bean.add(a);}myAdapter.notifyDataSetChanged();swiperefreshlayou.setMoreData(true);//设置还有数据可以加载swiperefreshlayou.setLoading(false);//停止加载更多break;case REFRESH_COMPLETE:bean.clear();for (int i = 0; i < 5; i++) {A a = new A();a.setDescribe("----" + i);bean.add(a);}swiperefreshlayou.setMoreData(true);//设置还有数据可以加载myAdapter.notifyDataSetChanged();swiperefreshlayou.setRefreshing(false);//停止刷新break;}}};
转载于:https://my.oschina.net/aibenben/blog/369414
android SwipeRefreshLayout 增加上拉加载更多相关推荐
- android listview自动加载更多,如何实现 Android ListView『上拉加载更多』?
ListView上拉加载更多的UI需求 (1)向上滑动 ListView,当最后一个条目滚入屏幕时开始加载更多条目,在列表底部增加一个 footerView:一个 infinite progressB ...
- 结合SwipeRefreshLayout可以上拉加载更多下拉刷新的RecyclerView
源码下载地址:http://download.csdn.net/detail/zhou_anzhuojinjie/9661542 话不多说直接上代码 dependencies {compile fil ...
- 给SwipeRefreshLayout添加上拉加载更多功能
下拉刷新,滑动到底部加载更多是App中很常见的功能,github上也有很多这样的开源库提供这样的功能,但大多数是在listview,recycleview等列表类上面做了一层包装,后来google推出 ...
- Android下拉刷新、上拉加载更多组件FlyRefreshLayout详解
舞动着键盘和鼠标,我誓言要把这个世界写的明明白白 本文出自门心叼龙的博客,属于原创类容,转载请注明出处.https://blog.csdn.net/geduo_83/article/details/8 ...
- android 加载更多动画效果,Android实践之带加载效果的下拉刷新上拉加载更多
前言 之前写的一个LoadingBar,这次把LoadingBar加到下拉刷新的头部.从头写一个下拉刷新,附赠上拉加载更多.下面话不多说了,来一起看看详细的介绍吧. 效果图: 实现过程 首先是自定义属 ...
- 【Android归纳】基于XListView的下拉刷新、上拉加载更多的控件分析
目录 前言 功能介绍 总体设计 组成 类关系图 详细设计 XlistViewHeader原理分析 XListViewFooter原理分析 XListView原理分析 代码带注释下载 目录 前言 如果你 ...
- Android项目:使用pulltorefresh开源项目扩展为下拉刷新上拉加载更多的处理方法,监听listview滚动方向...
很多android应用的下拉刷新都是使用的pulltorefresh这个开源项目,但是它的扩展性在下拉刷新同时又上拉加载更多时会有一定的局限性.查了很多地方,发现这个开源项目并不能很好的同时支持下拉刷 ...
- Android RecyclerView封装下拉刷新与上拉加载更多
1 scanlistlibrary 基础组件说明(基于 RecyclerView的封装) 基本数据列表(支持下拉刷新与上拉加载更多) 九宫格数据显示封装(支持下拉刷新与上拉加载更多) 瀑布流数据显示封 ...
- android listview下拉刷新动画,android 安卓 listview 支持下拉刷新 上拉加载更多
[1]重写listViewimport java.text.SimpleDateFormat; import java.util.Date; import com.example.testdddlea ...
最新文章
- 2022-2028年中国出版业投资分析及前景预测报告(全卷)
- java中的分页 效率考虑_面试官:数据量很大,分页查询很慢,有什么优化方案?...
- poj 3254 Corn Fields (状态压缩DP)
- DIV+CSS网页布局常用的一些基础知识
- 节省公司的宽带接入成本
- Kobe Bryant crash report
- 自己封装一个MySignal函数,方便以后直接copy.
- InsightFace及其mxnet、tensorflow代码实现
- 数据分析项目某电商app行为数据分析(1)
- python123输出hello world_Python基础:输入与输出
- 移动端H5 腾讯地图sdk 当前位置 地址你解析 距离计算
- C#不同窗体间通信,数据传递
- MongoDB聚合运算之mapReduce函数的使用(11)
- 关于如何在vs 2005中使用sa用户登录的问题(即在vs 2005中SQL 2005的深层使用)
- Purftpd的详细安装配置
- docker命令总结(二)
- 网上商城——详细流程
- Keras框架使用Vnet2d模型对遥感图像语义分割
- 短链接java代码_java高仿新浪微博短链接地址生成工具ShortUrlGenerator.java
- 计算机丢失dll文件怎么弄,电脑缺少DLL文件该怎么办? 这个办法轻松解决!
热门文章
- 苹果7【】闪存测试软件,不厚道!iPhone7大容量版竟采用TLC闪存
- spark数据查询语句select_sparksql读取hive表中数据
- Java实用教程笔记 泛型与集合框架
- FPGA之道(53)状态机的模型
- 【 FPGA 】控制数码管动态扫描显示的小实验
- 【 数字信号处理 】定点数的表示之定点数的字长问题
- [彻底理解]JDK1.8 函数式接口 Consumer Supplier 以及 JAVA新纪元 λ表达式的到来
- 介绍一篇关于session的好文章,写的很详细
- github的pull request是指什么意思?有什么用处
- 基于注解的DWR使用