iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >在android应用中怎么添加一个上拉刷新下拉加载功能
  • 344
分享到

在android应用中怎么添加一个上拉刷新下拉加载功能

androidroi 2023-05-31 08:05:12 344人浏览 安东尼
摘要

在Android应用中怎么添加一个上拉刷新下拉加载功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。下拉刷新首先我们给出如下几个参数,后面要用:  pr

Android应用中怎么添加一个上拉刷新下拉加载功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

下拉刷新

首先我们给出如下几个参数,后面要用:

  private NestedScrollingParentHelper helper = null;  private boolean IsRefresh = true;  private boolean IsLoad = true;  //滑动的总距离  private int totalY = 0;  private LinearLayout headerLayout = null;  private MyRecyclerView myRecyclerView = null;  private LinearLayout footerLayout = null;

既然是刷新,我们的滚动肯定是在父view之前的。所以我们需要在onNestedPreScroll这个方法里面写上我们所需要改动的x,y值。

我们需要用父view去拦截它。

我们需要判断dy的值是否大于0,因为大于0是刷新操作,小于0是加载操作。然后我们需要判断recyclerview是否是纵向的而不是横向的。

public void onNestedPreScroll(View target, int dx, int dy, int[] consumed) {    if (IsRefresh) {      if (dy > 0) {        if (myRecyclerView.isOrientation(0)) {          totalY += dy;          if ((totalY / 2) <= 0) {            scrollTo(0, totalY / 2);            consumed[1] = dy;          } else {            scrollTo(0, 0);            consumed[1] = 0;          }        }        return;      }    }

上拉加载

上面我也说了onNestedPreScroll这个方法中判断dy<0才是加载操作。所以综上所述,代码变成了这样:

 public void onNestedPreScroll(View target, int dx, int dy, int[] consumed) {    if (totalY < 0 && myRecyclerView.isOrientation(0) || totalY > 0 && myRecyclerView.isOrientation(1)) {      isfling = true;    }    if (IsRefresh) {      if (dy > 0) {        if (myRecyclerView.isOrientation(0)) {          totalY += dy;          if ((totalY / 2) <= 0) {            scrollTo(0, totalY / 2);            consumed[1] = dy;          } else {            scrollTo(0, 0);            consumed[1] = 0;          }        }        return;      }    }    if (IsLoad) {      if (dy < 0) {        if (myRecyclerView.isOrientation(1)) {          totalY += dy;          if ((totalY / 2) >= 0) {            scrollTo(0, totalY / 2);            consumed[1] = dy;          } else {            scrollTo(0, 0);            consumed[1] = 0;          }        }        return;      }    }  }

最后我们需要在子view滑动结束后,实行如下操作:

 //子view滑动结束调用  //dyUnconsumed < 0 向下滚  //dyUnconsumed > 0 向上滚  public void onNestedScroll(View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) {    if (dyUnconsumed != 0) {      totalY += dyUnconsumed;      scrollTo(0, totalY / 2);    }  }

其实最主要的两个方法已经解决了,其他到没什么了,这边,我把nestedscrolling的8个接口的功能和自定义recyclerview放出来。已变大家参考。希望大家都能实现自己的刷新加载。告别swiperefreshlayout。

添加header和footer

这里我们参考listview自带的addheaderview和addfooterview。代码如下:

 public void addHeaderView(View headerView, int headerHeight) {    this.headerLayout.removeAllViews();    this.headerLayout.addView(headerView);    LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, headerHeight);    layoutParams.topMargin = -headerHeight;    this.headerLayout.setLayoutParams(layoutParams);  }  public void addFooterView(View footerView, int footerHeight) {    this.footerLayout.removeAllViews();    this.footerLayout.addView(footerView);    this.footerLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, footerHeight));  }

几个接口的实现

 public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes) {    return true;  }  public void onNestedScrollAccepted(View child, View target, int axes) {    helper.onNestedScrollAccepted(child, target, axes);  }  //父view拦截子view的滚动  public void onNestedPreScroll(View target, int dx, int dy, int[] consumed) {    if (totalY < 0 && myRecyclerView.isOrientation(0) || totalY > 0 && myRecyclerView.isOrientation(1)) {      isfling = true;    }    if (IsRefresh) {      if (dy > 0) {        if (myRecyclerView.isOrientation(0)) {          totalY += dy;          if ((totalY / 2) <= 0) {            scrollTo(0, totalY / 2);            consumed[1] = dy;          } else {            scrollTo(0, 0);            consumed[1] = 0;          }        }        return;      }    }    if (IsLoad) {      if (dy < 0) {        if (myRecyclerView.isOrientation(1)) {          totalY += dy;          if ((totalY / 2) >= 0) {            scrollTo(0, totalY / 2);            consumed[1] = dy;          } else {            scrollTo(0, 0);            consumed[1] = 0;          }        }        return;      }    }  }  //子view滑动结束调用  //dyUnconsumed < 0 向下滚  //dyUnconsumed > 0 向上滚  public void onNestedScroll(View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) {    if (dyUnconsumed != 0) {      totalY += dyUnconsumed;      scrollTo(0, totalY / 2);    }  }  public void onStopNestedScroll(View child) {    helper.onStopNestedScroll(child);    if (onTouchUpListener != null) {      isfling = false;      onTouchUpListener.touchUp();    }  }  public boolean onNestedFling(View target, float velocityX, float velocityY, boolean consumed) {    return isfling;  }  public boolean onNestedPreFling(View target, float velocityX, float velocityY) {    return isfling;  }  public int getNestedScrollAxes() {    return helper.getNestedScrollAxes();  }

自定义recyclerview

既然是自己写的刷新加载框架,总不能还有自定义layout中在放个recyclerview。多麻烦,自定义一个,直接放在里面,然后分别放个header和footer 就没必要每次有页面用到刷新都要写一个布局。3个布局解决整个项目的刷新和加载。话不多说,代码如下:

  private class MyRecyclerView extends RecyclerView {    private StaggeredGridLayoutManager staggeredGridLayoutManager = null;    private LinearLayoutManager linearLayoutManager = null;    private GridLayoutManager gridLayoutManager = null;    private boolean isScrollLoad = false;    private boolean isScrollRefresh = false;    public MyRecyclerView(Context context) {      super(context);      setVerticalFadingEdgeEnabled(false);      setHorizontalFadingEdgeEnabled(false);      setVerticalScrollBarEnabled(false);      setHorizontalScrollBarEnabled(false);      setOverScrollMode(OVER_SCROLL_NEVER);      setItemAnimator(new DefaultItemAnimator());    }    private void setMyLayoutManager(LayoutManager layoutManager) {      if (layoutManager instanceof StaggeredGridLayoutManager) {        staggeredGridLayoutManager = (StaggeredGridLayoutManager) layoutManager;      } else if (layoutManager instanceof GridLayoutManager) {        gridLayoutManager = (GridLayoutManager) layoutManager;      } else if (layoutManager instanceof LinearLayoutManager) {        linearLayoutManager = (LinearLayoutManager) layoutManager;      }      setLayoutManager(layoutManager);      if (!isVertical()) {        throw new NullPointerException("vertical!");      }    }    private boolean isOrientation(int orientation) {//orientation,0代表向下,1代表向上      if (orientation == 0)        return isCanPullDown();      else if (orientation == 1)        return isCanPullUp();      return false;    }    private boolean isCanPullDown() {      return !canScrollVertically(-1);    }    private boolean isCanPullUp() {      return !canScrollVertically(1);    }//    private int scrollLoad() {//      int lastItem = 0;//      int itemCount = 0;//      int spanCount = 1;//      if (staggeredGridLayoutManager != null) {//        lastItem = staggeredGridLayoutManager.findLastVisibleItemPositions(null)[0];//        itemCount = staggeredGridLayoutManager.getItemCount();//        spanCount = staggeredGridLayoutManager.getSpanCount();//      } else if (linearLayoutManager != null) {//        lastItem = linearLayoutManager.findLastVisibleItemPosition();//        itemCount = linearLayoutManager.getItemCount();//        spanCount = 1;//      } else if (gridLayoutManager != null) {//        lastItem = gridLayoutManager.findLastVisibleItemPosition();//        itemCount = gridLayoutManager.getItemCount();//        spanCount = gridLayoutManager.getSpanCount();//      }//      return ((itemCount - 1) / spanCount + 1) - (lastItem / spanCount + 1);//    }    private boolean isVertical() {      if (staggeredGridLayoutManager != null)        return staggeredGridLayoutManager.getOrientation() == StaggeredGridLayoutManager.VERTICAL;      else if (linearLayoutManager != null)        return linearLayoutManager.getOrientation() == LinearLayoutManager.VERTICAL;      else if (gridLayoutManager != null)        return gridLayoutManager.getOrientation() == GridLayoutManager.VERTICAL;      return false;    }//    public void onScrolled(int dx, int dy) {//      if (dy > 0 && !isScrollLoad) {//        if (oLior != null) {//          onScrollListener.scrollLoad(sc```````````llLoad());//传递滚动到倒数第几行//        }//      }//    }  }

关于在android应用中怎么添加一个上拉刷新下拉加载功能问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网精选频道了解更多相关知识。

--结束END--

本文标题: 在android应用中怎么添加一个上拉刷新下拉加载功能

本文链接: https://www.lsjlt.com/news/224566.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 在android应用中怎么添加一个上拉刷新下拉加载功能
    在android应用中怎么添加一个上拉刷新下拉加载功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。下拉刷新首先我们给出如下几个参数,后面要用:  pr...
    99+
    2023-05-31
    android roi
  • 怎么在Android应用中添加一个下拉刷新功能
    这篇文章将为大家详细讲解有关怎么在Android应用中添加一个下拉刷新功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。需要给内容加载监听器    function bindEvent() ...
    99+
    2023-05-31
    android roi
  • 在Android项目中使用RecyclerView实现一个上拉加载下拉刷新功能
    这篇文章给大家介绍在Android项目中使用RecyclerView实现一个上拉加载下拉刷新功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。核心实现package com.example.fly.recyclervi...
    99+
    2023-05-31
    recyclerview android recycle
  • uniapp怎么实现下拉刷新和上拉加载功能
    随着移动端开发的不断升级,开发者们对于移动应用的需求也越来越高。而在很多移动应用中,下拉刷新和上拉加载更多是必不可少的功能之一,为了提高用户体验,许多移动应用都会加入这两个功能。在这里,我们将介绍如何在uniapp中实现下拉刷新和上拉加载更...
    99+
    2023-05-14
  • MUI如何实现上拉刷新/下拉加载功能
    小编给大家分享一下MUI如何实现上拉刷新/下拉加载功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!新闻信息列表必备的功能,支持...
    99+
    2024-04-02
  • Android如何通过XListView实现上拉加载下拉刷新功能
    小编给大家分享一下Android如何通过XListView实现上拉加载下拉刷新功能,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!具体内容如下## 导入XListVIew第三方库文件。通过LinkedList将刷新...
    99+
    2023-05-30
  • react native中怎么利用FlatList实现下拉刷新上拉加载功能
    本篇文章为大家展示了react native中怎么利用FlatList实现下拉刷新上拉加载功能,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。android效果图总体...
    99+
    2024-04-02
  • vue.js怎么实现拉加载以及下拉刷新功能
    本篇内容主要讲解“vue.js怎么实现拉加载以及下拉刷新功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue.js怎么实现拉加载以及下拉刷新功能”吧!上拉加...
    99+
    2024-04-02
  • Flutter中怎么利用listview实现下拉刷新上拉加载更多功能
    这期内容当中小编将会给大家带来有关Flutter中怎么利用listview实现下拉刷新上拉加载更多功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。下拉刷新在Flutter中系统已经为我们提供了googl...
    99+
    2023-06-20
  • Android应用中怎么实现一个下拉刷新功能
    Android应用中怎么实现一个下拉刷新功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、下拉才出现的视图pull_to_refresh_header.xml<x...
    99+
    2023-05-31
    android roi
  • Vue uni-app框架实现上拉加载下拉刷新功能
    目录实现上拉加载更多优化实现下拉刷新实现上拉加载更多 打开项目根目录中的pages.json配置文件,为subPackages分包中的商品goods_list页面配置上拉触底的距离:...
    99+
    2024-04-02
  • dropload.js插件下拉刷新和上拉加载怎么用
    小编给大家分享一下dropload.js插件下拉刷新和上拉加载怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体内容如下第...
    99+
    2024-04-02
  • Vue vant-ui框架实现上拉加载下拉刷新功能
    目录知识点速记基本用法下拉刷新代码实现1.页面布局2.样式3.方法下拉刷新效果: 知识点速记 基本用法 List通过loading和finished两个变量控制加载状态,当组件滚动...
    99+
    2024-04-02
  • vue 使用mescroll.js框架实现下拉加载和上拉刷新功能
    以下是代码是在项目中抽取出来的,都是实现下拉刷新上拉加载的要点。 注:以下不是用vue-cli写的,用vue-cli的请绕过,抱歉~ 1、mescroll 的页面的初始化 initM...
    99+
    2024-04-02
  • Flutter listview如何实现下拉刷新上拉加载更多功能
    目录下拉刷新 RefreshIndicator 上拉加载更多 总结:下拉刷新 在Flutter中系统已经为我们提供了google material design的刷新功能 , 样式...
    99+
    2024-04-02
  • 小程序怎么实现上拉刷新下拉加载
    这篇文章主要介绍“小程序怎么实现上拉刷新下拉加载”,在日常操作中,相信很多人在小程序怎么实现上拉刷新下拉加载问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”小程序怎么实现上拉刷新下拉加载”的疑惑有所帮助!接下来...
    99+
    2023-06-26
  • Android自定义ListView实现下拉刷新上拉加载更多
    目录1、创建刷新控件1.1、创建头部View1.2、下拉事件1.3、接口回调2、上拉加载更多2.1、底部样式2.2、布局添加Listview现在用的很少了,基本都是使用Recycle...
    99+
    2024-04-02
  • Spring怎么实现上拉刷新和下拉加载效果
    这篇文章主要介绍Spring怎么实现上拉刷新和下拉加载效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!导依赖:compile 'com.android.support:recyclerview-v...
    99+
    2023-05-30
    spring
  • 微信小程序如何实现下拉加载与上拉刷新功能
    这篇文章主要介绍微信小程序如何实现下拉加载与上拉刷新功能,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!微信小程序下拉刷新上拉加载的两种实现方法实现效果图:方法一:onPullDown...
    99+
    2024-04-02
  • 如何在Android中利用Recyclerview实现一个上拉加载功能
    如何在Android中利用Recyclerview实现一个上拉加载功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在项目中使用列表的下拉刷新和上拉加载更多是很常见的功能,下拉...
    99+
    2023-05-31
    android recyclerview recycle
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作