Android 新控件之SwipeRefreshLayout添加上拉加载和下拉刷新

写着篇博客开始 ,不得不得发发牢骚了。为什么你搞一个下拉刷新,你为什么不直接再加一个上拉加载呢? 我们都很蓝瘦啊,开心的用上了原生的swiperefreshlayout 但是万万没想到 人家只有下拉刷新 没有上拉加载。
  他没有加怎么办? 我们自己加啊。那么牛逼已经吹出去了 ,接下来就是教大家如何添加上拉加载。下拉刷新的话其实很简单我就简单贴上代码


setColorSchemeResources(R.color.orange, R.color.green,
R.color.holo_red_light); // 进度动画颜色
setProgressBackgroundColorSchemeResource(
R.color.light_gray); // 进度背景颜色

就加上上面的配置下颜色就行。那么如何添加上拉加载呢
  首先 大家要明白什么时候出现上拉加载 就是listview 滚动到底部的时候添加上拉加载。如何判断到了底部呢。网上你查的很多都是这样的?

lv.getLastVisiblePosition()==lv.getAdapter().getCount()-1

那么这样到底行不行? 答案是行 但是有些不尽人意 因为如果你的条目够高的话你会发现,最后一个条目刚露头 你就开始加载了 ,但是用户完全懵逼不知道到底了。所以如何在真正的滚到底部的时候加载呢。就是加一个判断最后一个条目的bottom 如果等于 listview 的高度那么肯定是滚动到底部了吧所以最后判断是这样的

if(lv.getLastVisiblePosition()==lv.getAdapter().getCount()-1 //最后一个条目
     &&!isLoading // 之前没有执行加载 防止重新加载
     &&isPullUp()  // 是上拉操作 根据touchevent判断y 坐标即可){
ViewlastVisibleItemView=lv.getChildAt(lv.getChildCount() - 1);
    if (lastVisibleItemView != null && lastVisibleItemView.getBottom() == lv.getHeight()) {
      // 执行上拉加载更多
  }
}

这样 上拉加载的触发条件我们就知道了。那么接下来就是 在触发的时候为listview 添加一个footer 就行了。 然后在加载完毕移除这个footer 就完事了 ,那这么说是不是很简单的完成了呢 我想说基本的上拉加载你知道这些就可以完成了。那么很多上拉加载的都是一边网上拉一边改变底部加载的高度是怎么实现的呢? 我简单说下原理因为我嫌麻烦没做 (鄙视自己一秒钟)其实就是先添加那个footer 然后设置他的margintop 为一个负值 这样他可以隐藏起来, 当我们滚动到底部的时候 监听手机移动事件根据那个y变化 ,动态改变footer 的margin,最后当footer 完全显示时 执行加载动画。 我直接贴上最后的代码

* Created by sunyeyu  on 2017-02-28 .
*/
public class MySwipeRefreshLayout extends SwipeRefreshLayout implements AbsListView.OnScrollListener {
  private ListView lv;
  int footerLayoutId;
  private boolean isLoading;
  private float downY;
  private float upY;
  private View footer;
  private boolean isRefreshFoot;
public MySwipeRefreshLayout(Context context) {
 super(context);
 init();
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
 super.onMeasure(widthMeasureSpec, heightMeasureSpec);
 intchilds=getChildCount();
  if (childs>0) {
   if (getChildAt(1)instanceof ListView) {
   if(lv==null) { // 要判断为空时才进行下面的操作 因为每次当下拉刷新的时候 omeasure 是会多次调用的 所以避免重复调用
   lv= (ListView) getChildAt(1);// 这里我们是用的1 因为0 是那个下拉刷新的源圈
   lv.setAdapter(ba);
   lv.setOnScrollListener(this);
   lv.setOnItemClickListener(oic);
   footer=View.inflate(getContext(),footerLayoutId,null);
}
}
}
}
public MySwipeRefreshLayout(Context context, AttributeSet attrs) {
  super(context, attrs);
  TypedArrayta=context.obtainStyledAttributes(attrs, R.styleable.MySwipeRefreshLa  yout);// 我这里用了自定义属性来添加footer 的布局
   footerLayoutId=ta.getResourceId(R.styleable.MySwipeRefreshLayout_footerLayoutI   d,0); // 得到footer布局id 加载出view
   if(footerLayoutId==0){
   Log.e("MySwipeRefreshLayout","没有在xml配置footer的布局id属性");
}
init();
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
  switch (ev.getAction()){
    case MotionEvent.ACTION_DOWN:
     downY=ev.getRawY();
     break;
    case MotionEvent.ACTION_UP:
     upY=ev.getRawY();
     canLoadMore();// 抬起是判断是否可以显示上拉加载
  }
   return super.dispatchTouchEvent(ev);
}
 AdapterView.OnItemClickListener oic;
 public void setListItemClickListener(AdapterView.OnItemClickListener oic){
    this.oic=oic; // 我这里并没有直接用 lv.setonitemclicklistener(oic)  因为这   时候 lv 还没有被赋值 这时候调用时会报空指针的。
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
   return super.onInterceptTouchEvent(ev);
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
  @Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
  int totalItemCount) {
   canLoadMore();
}
private void canLoadMore() {
   if(lv.getLastVisiblePosition()==lv.getAdapter().getCount()-1&&
    !isLoading&&isPullUp()){
    ViewlastVisibleItemView=lv.getChildAt(lv.getChildCount() - 1);
   if (lastVisibleItemView != null && lastVisibleItemView.getBottom() == lv.getHeight())    {
   Load();
    }
   }
}
private boolean isPullUp() {
   if(upY
    return true;
   }
    return  false;
}
private void Load(){
   isLoading=true;
    lv.addFooterView(footer);
   if(mOnLoadListener!=null){
    mOnLoadListener.onLoad();
   }
}
public void setFooter(boolean hasRefreshFoot){
  if(!hasRefreshFoot){
    lv.removeFooterView(footer);
    isLoading=false;
  }
}
public void setHeaderListener(OnRefreshListener ol){
   setColorSchemeResources(R.color.orange, R.color.green,
   R.color.holo_red_light); // 进度动画颜色
   setProgressBackgroundColorSchemeResource(
   R.color.light_gray); // 进度背景颜色
   setOnRefreshListener(ol);
}
BaseAdapter ba;
public void setAdapter(BaseAdapter ba){
   this.ba=ba;
}
/**  刷新结束 取消下拉刷新 */
public void setHeader(boolean isHeader){
   setRefreshing(isHeader);
}
    /**
      * 加载更多的监听器
    */
public interface OnLoadMoreListener {
   void onLoad();
}
OnLoadMoreListener mOnLoadListener;
public void setOnLoadListener(OnLoadMoreListener loadListener) {
   mOnLoadListener=loadListener;
  }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容