全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android RecyclerView上拉加载更多功能回弹实现代码

实现原理是使用RecyclerView的OnTouchListener方法监听滑动 在adapter里面增加两项footview 其中date.size为显示的加载条,可以自定义,date.size+1为空白的View,我们设置其高度为0 我们通过LinearLayoutManager的 findLastVisibleItemPosition判断显示的最后一条数据,如果是空白view,表示加载条已经完全展示,松开即可刷新。

回弹效果是通过在滑动时动态改变空白view的高度,达到阻尼效果 ,回弹时再动态将其改为0,达到回弹效果,通过loading防止加载过程中滑动导致显示问题 这里的回调采用了Runnable传参

public class RefreshFootAdapter extends 
    RecyclerView.Adapter<RecyclerView.ViewHolder> { 
  // 上拉加载更多 
  public static final int SATUS_PULLUP_LOAD_MORE = 0; 
  // 正在加载中 
  public static final int SATUS_LOADING_MORE = 1; 
  public static final int SATUS_UP_LOADING_MORE = 2; 
  // 上拉加载更多状态-默认为0 
  private int load_more_status = 0; 
  private LayoutInflater mInflater; 
  private List<String> mTitles = null; 
  private static final int TYPE_ITEM = 0; // 普通Item View 
  private static final int TYPE_FOOTER = 1; // 底部FootView 
  private static final int TYPE_FOOTER_EMPTY = 2; // 底部空白View 
  private static int pagesize; 
  private int eview_height = 1; 
  private long TimeFlag;// 回弹时间 
  private RecyclerView parent; 
  private boolean loadmare;// 判断当前是可加载更多 
  private boolean loading;// 判断是否正在加载 
  private int startY, nowY;// 滑动判断 
<span style="white-space:pre"> </span>//构造函数 处理滑动监听 更新等功能 
  public RefreshFootAdapter(Context context, RecyclerView parent, 
      final LinearLayoutManager linearLayoutManager, int pagesize, 
      final Runnable onloadmore) { 
    this.parent = parent; 
    this.mInflater = LayoutInflater.from(context); 
    this.mTitles = new ArrayList<String>(); 
    for (int i = 0; i < 20; i++) { 
      int index = i + 1; 
      mTitles.add("item" + index); 
    } 
    this.pagesize = pagesize; 
    parent.setOnTouchListener(new OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent ev) { 
        // TODO Auto-generated method stub 
        switch (ev.getAction()) { 
        case MotionEvent.ACTION_MOVE: 
          nowY = (int) ev.getY(); 
          if (RefreshFootAdapter.this.getItemCount() == linearLayoutManager 
              .findLastVisibleItemPosition() + 1) { 
            if (startY == 0) {// 按下 
              startY = nowY; 
            } 
            int changeY = nowY - startY; 
            RefreshFootAdapter.this 
                .notifyEmptyView((int) (-changeY / 1.3f)); 
            if (loading) { 
              return false; 
            } 
            RefreshFootAdapter.this 
                .changeMoreStatus(RefreshFootAdapter.this.SATUS_UP_LOADING_MORE); 
            loadmare = true; 
          } else { 
            loadmare = false; 
            if (loading) { 
              return false; 
            } 
            RefreshFootAdapter.this 
                .changeMoreStatus(RefreshFootAdapter.this.SATUS_PULLUP_LOAD_MORE); 
            // 普通的滑动 
            startY = 0; 
          } 
          break; 
        case MotionEvent.ACTION_UP: 
          RefreshFootAdapter.this.resetEmptyView(); 
          if (loadmare) { 
            if (loading) { 
              return false; 
            } else { 
              RefreshFootAdapter.this 
                  .changeMoreStatus(RefreshFootAdapter.this.SATUS_LOADING_MORE); 
              if (onloadmore != null && !loading) { 
                loading = true; 
                onloadmore.run(); 
              } 
            } 
          } 
          startY = 0; 
          break; 
        default: 
          break; 
        } 
        return false; 
      } 
    }); 
  } 
  /** 
   * item显示类型 
   * 
   * @param parent 
   * @param viewType 
   * @return 
   */ 
  public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, 
      int viewType) { 
    // 进行判断显示类型,来创建返回不同的View 
    if (viewType == TYPE_ITEM) { 
      View view = mInflater.inflate(R.layout.item_recycler_layout, 
          parent, false); 
      // 这边可以做一些属性设置,甚至事件监听绑定 
      // view.setBackgroundColor(Color.RED); 
      ItemViewHolder itemViewHolder = new ItemViewHolder(view); 
      return itemViewHolder; 
    } else if (viewType == TYPE_FOOTER) { 
      View foot_view = mInflater.inflate( 
          R.layout.recycler_load_more_layout, parent, false); 
      // 这边可以做一些属性设置,甚至事件监听绑定 
      // view.setBackgroundColor(Color.RED); 
      FootViewHolder footViewHolder = new FootViewHolder(foot_view); 
      return footViewHolder; 
    } else if (viewType == TYPE_FOOTER_EMPTY) { 
      View foot_view_empty = mInflater.inflate( 
          R.layout.recycler_load_more_layout_empty, parent, false); 
      // 这边可以做一些属性设置,甚至事件监听绑定 
      // view.setBackgroundColor(Color.RED); 
      FootEmptyHolder footEmptyViewHolder = new FootEmptyHolder( 
          foot_view_empty); 
      return footEmptyViewHolder; 
    } 
    return null; 
  } 
  /** 
   * 数据的绑定显示 
   * 
   * @param holder 
   * @param position 
   */ 
  public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    if (holder instanceof ItemViewHolder) { 
      ((ItemViewHolder) holder).item_tv.setText(mTitles.get(position)); 
      holder.itemView.setTag(position); 
    } else if (holder instanceof FootViewHolder) { 
      FootViewHolder footViewHolder = (FootViewHolder) holder; 
      switch (load_more_status) { 
      case SATUS_PULLUP_LOAD_MORE: 
        footViewHolder.foot_view_item_tv.setText("上拉加载更多..."); 
        break; 
      case SATUS_LOADING_MORE: 
        footViewHolder.foot_view_item_tv.setText("正在加载更多数据..."); 
        break; 
      case SATUS_UP_LOADING_MORE: 
        footViewHolder.foot_view_item_tv.setText("松开加载更多数据..."); 
        break; 
      } 
    } else if (holder instanceof FootEmptyHolder) { 
      FootEmptyHolder footViewHolder = (FootEmptyHolder) holder; 
      footViewHolder.empty.setLayoutParams(new ViewGroup.LayoutParams( 
          111, eview_height)); 
    } 
  } 
  /** 
   * 进行判断是普通Item视图还是FootView视图 
   * 
   * @param position 
   * @return 
   */ 
  @Override 
  public int getItemViewType(int position) { 
    // 最后一个item设置为footerView 
    if (position + 1 == getItemCount()) { 
      return TYPE_FOOTER_EMPTY; 
    } else if (position + 2 == getItemCount()) { 
      return TYPE_FOOTER; 
    } else { 
      return TYPE_ITEM; 
    } 
  } 
<span style="white-space:pre"> </span>//如果是页数的倍数 itemcount+2 
  @Override 
  public int getItemCount() { 
    if (mTitles.size() % pagesize != 0) { 
      return mTitles.size(); 
    } else { 
      return mTitles.size() + 2; 
    } 
    // return mTitles.size()+1; 
  } 
  // 自定义的ViewHolder,持有每个Item的的所有界面元素 
  public static class ItemViewHolder extends RecyclerView.ViewHolder { 
    public TextView item_tv; 
    public ItemViewHolder(View view) { 
      super(view); 
      item_tv = (TextView) view.findViewById(R.id.item_tv); 
    } 
  } 
  /** 
   * 底部FootView布局 
   */ 
  public static class FootViewHolder extends RecyclerView.ViewHolder { 
    private TextView foot_view_item_tv; 
    public FootViewHolder(View view) { 
      super(view); 
      foot_view_item_tv = (TextView) view 
          .findViewById(R.id.foot_view_item_tv); 
    } 
  } 
<span style="white-space:pre"> </span>//空白项 
  public static class FootEmptyHolder extends RecyclerView.ViewHolder { 
    private View empty; 
    public FootEmptyHolder(View view) { 
      super(view); 
      empty = view.findViewById(R.id.empty); 
    } 
  } 
  // 添加数据 
  public void addItem(List<String> newDatas) { 
    // mTitles.add(position, data); 
    // notifyItemInserted(position); 
    newDatas.addAll(mTitles); 
    mTitles.removeAll(mTitles); 
    mTitles.addAll(newDatas); 
    notifyDataSetChanged(); 
  } 
<span style="white-space:pre"> </span>//更新添加数据 
  public void addMoreItem(List<String> newDatas) { 
    mTitles.addAll(newDatas); 
    notifyDataSetChanged(); 
  } 
<span style="white-space:pre"> </span>//更新空白项高度 
  private void notifyEmptyView(int height) { 
    this.eview_height = height; 
    notifyItemChanged(getItemCount() - 1); 
  } 
<span style="white-space:pre"> </span>//空白回弹 伪回弹动画 
  private void resetEmptyView() { 
    final int dx = eview_height; 
    new Thread(new Runnable() { 
      @Override 
      public void run() { 
        // TODO Auto-generated method stub 
        final int time = 500; 
        final long startTime = new Date().getTime(); 
        TimeFlag = startTime; 
        long nowTime = new Date().getTime(); 
        while (startTime + time > nowTime && TimeFlag == startTime) { 
          nowTime = new Date().getTime(); 
          final int dt = (int) (nowTime - startTime); 
          parent.post(new Runnable() { 
            @Override 
            public void run() { 
              // TODO Auto-generated method stub 
              eview_height = eview_height * (time - dt) / time; 
              notifyDataSetChanged(); 
            } 
          }); 
          try { 
            Thread.sleep(10); 
          } catch (InterruptedException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
          } 
        } 
        parent.post(new Runnable() { 
          @Override 
          public void run() { 
            // TODO Auto-generated method stub 
            eview_height = 0; 
            notifyDataSetChanged(); 
          } 
        }); 
      } 
    }).start(); 
  } 
<span style="white-space:pre"> </span>//停止加载更多 重置loading状态和显示文本 
  public void stopLoadMore() { 
    notifyDataSetChanged(); 
    loading = false; 
    RefreshFootAdapter.this 
    .changeMoreStatus(RefreshFootAdapter.this.SATUS_PULLUP_LOAD_MORE); 
  } 
  //改变加载条状态 
  private void changeMoreStatus(int status) { 
    if (loading) { 
      return; 
    } 
    load_more_status = status; 
    notifyDataSetChanged(); 
  } 
} 

图1为滑动过程

图2为松开加载

以上所述是小编给大家介绍的Android RecyclerView上拉加载更多功能回弹实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# recyclerview上拉加载  # recyclerview实现回弹  # Android ScrollView的顶部下拉和底部上拉回弹效果  # android仿QQ个人主页下拉回弹效果  # Android界面上拉下拉的回弹效果实例代码  # Android ReboundScrollView仿IOS拖拽回弹效果  # Android仿IOS回弹效果 支持任何控件  # Android ScrollView实现横向和竖向拖动回弹效果  # Android自定义ScrollView实现放大回弹效果  # Android编程ViewPager回弹效果实例分析  # Android自定义控件仿ios下拉回弹效果  # Android基于reclyview实现列表回弹动画效果  # 加载  # 绑定  # 自定义  # 小编  # 正在加载  # 在此  # 将其  # 采用了  # 给大家  # 按下  # 等功能  # 设置为  # 两项  # 已经完全  # 所述  # 回调  # 给我留言  # 感谢大家  # 过程中  # 时再 


相关文章: seo网站制作优化,网站SEO优化步骤有哪些?  建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  建站之星会员如何解锁更多建站功能?  如何选择最佳自助建站系统?快速指南解析优劣  网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  Bpmn 2.0的XML文件怎么画流程图  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  网站制作价目表怎么做,珍爱网婚介费用多少?  香港服务器租用每月最低只需15元?  高端网站建设与定制开发一站式解决方案 中企动力  韩国服务器如何优化跨境访问实现高效连接?  如何在IIS7上新建站点并设置安全权限?  建站之星伪静态规则如何设置?  建站VPS选购需注意哪些关键参数?  网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?  建站主机选购指南:核心配置优化与品牌推荐方案  如何自定义建站之星模板颜色并下载新样式?  如何在建站宝盒中设置产品搜索功能?  如何在Windows虚拟主机上快速搭建网站?  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  深圳网站制作培训,深圳哪些招聘网站比较好?  建站之星安装需要哪些步骤及注意事项?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  深圳网站制作案例,网页的相关名词有哪些?  武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?  建站之星安装提示数据库无法连接如何解决?  大连 网站制作,大连天途有线官网?  网站专业制作公司有哪些,做一个公司网站要多少钱?  完全自定义免费建站平台:主题模板在线生成一站式服务  大型企业网站制作流程,做网站需要注册公司吗?  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?  如何高效完成自助建站业务培训?  营销式网站制作方案,销售哪个网站招聘效果最好?  文字头像制作网站推荐软件,醒图能自动配文字吗?  建站之星后台密码如何安全设置与找回?  建站之星收费标准详解:套餐费用及年费价格表一览  如何高效配置IIS服务器搭建网站?  盐城做公司网站,江苏电子版退休证办理流程?  定制建站是什么?如何实现个性化需求?  新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?  宁波自助建站系统如何快速打造专业企业网站?  建站之星如何一键生成手机站?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  建站上传速度慢?如何优化加速网站加载效率?  在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?  网站制作需要会哪些技术,建立一个网站要花费多少?  建站主机核心功能解析:服务器选择与网站搭建流程指南  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。