我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android自定义下拉刷新上拉加载

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android自定义下拉刷新上拉加载

本文实例为大家分享了Android自定义下拉刷新上拉加载的具体实现步骤,供大家参考,具体内容如下

实现的方式是SwipeRefreshLayout + RecyclerView 的VIewType

首先看效果:

这里写图片描述

总的思路:

这里写图片描述

布局文件


<android.support.v4.widget.SwipeRefreshLayout
    android:layout_marginTop="?attr/actionBarSize"
    android:id="@+id/one_refresh"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <android.support.v7.widget.RecyclerView
      android:id="@+id/one_recyclerView"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      >
    </android.support.v7.widget.RecyclerView>
  </android.support.v4.widget.SwipeRefreshLayout>

下拉刷新的实现思路

这里写图片描述

用于测试的Model


public class TestModel {
  private String mTitle;
  private String mDesc;
  private String mTime;
  public TestModel(String mTitle, String mDesc, String mTime) {
    this.mTitle = mTitle;
    this.mDesc = mDesc;
    this.mTime = mTime;
  }
  //...一堆getXxx ,setXxx方法
  //equals必写,添加数据时候用于判断
   @Override
  public boolean equals(Object o) {
    TestModel model = (TestModel) o;
    if (!mTitle.equals(model.getmTitle())) {
      return false;
    } else if (!mDesc.equals(model.getmDesc())) {
      return false;
    } else if (!mTime.equals(model.getmTitle())) {
      return false;
    }
    return true;
  }

模拟获取网络数据的代码


private class GetData {
    int size = 0 ;
    int max = 25; //数据的最大值
    public void setStart(int size) {
      this.size = size;
    }
    //根据size获取指定大小的List,最大不能超过max
    public List<TestModel> initData(int size) {
      List<TestModel> mDatas = new ArrayList<>();
      TestModel model = null;
      for (int i = start; i < ((size + start) > max ? max : (size + start)); i++) {
        model = new TestModel("Title" + i, "Desc" + i, "今天 11:30");
        mDatas.add(model);
      }
      start += size;
      return mDatas;
    }
  }

数据获取并通知初始化RecyclerView


public void initData() {
    if (getData == null) {
      getData = new GetData();
    }
    mLists = getData.initData(size); //获取默认显示的数量的item
    mhandler.sendEmptyMessage(REFRESH); //通知handler更新
  }

Handler中用于处理第一次显示数据和以后刷新操作的代码


if (msg.what == REFRESH) {
if (mAdapter == null) {
mAdapter = new OneAdapter(mContext);
mAdapter.setmDatas(mLists);//设置数据
//...对适配器的设置,这里先省去,免得混淆
mRecyclerView.setLayoutManager(new LinearLayoutManager(mContext));
mRecyclerView.setAdapter(mAdapter);
    } else {
     mAdapter.setmDatas(mLists);
     mAdapter.cleadnCount();
     mAdapter.notifyDataSetChanged();
   }
  initRefresh(); //判断refreshLayout是否在刷新,是的话取消刷新操作 .就不贴代码了显的乱糟糟

RefreshLayout的刷新事件


mRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
   @Override
   public void onRefresh() {
     new Thread(mRunnable).start();//runnable调用了initData()方法;
   }
   });

此时就可以对刷新操作做出响应了,与平时使用RefreshLayout的操作一样

上拉刷新的实现思路(主要在适配器中,activity中只需要一个当需要加载更多的时候更新数据源就行)

这里写图片描述

普通内容的布局


<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_margin="5dp"
  android:orientation="vertical"
  tools:context=".MainActivity">
  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">
    <ImageView
      android:scaleType="centerInside"
      android:id="@+id/item_head"
      android:layout_width="70dp"
      android:layout_height="70dp"
      android:layout_gravity="center"
      android:layout_margin="5dp"
      android:class="lazy" data-src="@mipmap/ic_launcher" />
    <LinearLayout
      android:layout_width="0dp"
      android:layout_height="match_parent"
      android:layout_marginLeft="5dp"
      android:layout_weight="1"
      android:orientation="vertical">
      <TextView
        android:id="@+id/item_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_weight="1"
        android:gravity="center_vertical"
        android:text="Title"
        android:textSize="20sp" />
      <TextView
        android:id="@+id/item_desc"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_weight="1"
        android:gravity="center_vertical"
        android:text="Desc"
        android:textSize="16sp" />
      <TextView
        android:id="@+id/item_time"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical|right"
        android:layout_marginRight="14dp"
        android:layout_weight="1"
        android:gravity="center_vertical|right"
        android:text="Time"
        android:textSize="20sp" />
    </LinearLayout>
  </LinearLayout>
</android.support.v7.widget.CardView>

加载更多的内容布局(默认显示ProgressBar,没有更多的图标隐藏)


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="40dp"
  android:orientation="horizontal">
  <ImageView
    android:id="@+id/load_image"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical|right"
    android:layout_weight="1"
    android:scaleType="centerInside"
    android:class="lazy" data-src="@mipmap/ic_launcher"
    android:visibility="gone" />
  <ProgressBar
    android:id="@+id/load_progress"
    style="@style/Widget.AppCompat.ProgressBar"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center_vertical|right"
    android:layout_weight="1" />
  <TextView
    android:id="@+id/load_tv"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:layout_weight="1"
    android:gravity="center_vertical|left"
    android:text="正在加载更多...."
    android:textColor="@color/colorBlank"
    android:textSize="20sp" />
</LinearLayout>

itemCount(因为我们要在最后显示信息,所以item的总数应该是加1,但是也是分情况的:


@Override
  public int getItemCount() {
    if (mDatas.size() > minShowLoad) { //当前item能将屏幕显示满
      return mDatas.size() + 1; //则默认显示加载或者没有更多
    }
    return mDatas.size(); //如果不能显示满,则不显示加载和没有更多
  }

getViewType(根据不同的位置显示不同的type)


@Override
  public int getItemViewType(int position) {
    if (position == mDatas.size()) {
      return VIEWTYPE_LOAD; //最后一个显示加载信息
    }
    return VIEWTYPE_CONTENT;//否则显示正常布局
  }

正常内容的ViewHolder


//内容布局
  private class ContentViewHolder extends RecyclerView.ViewHolder {
    private TextView mTitle;
    private TextView mDesc;
    private TextView mTime;
    private ImageView mHead;
    private View itemView;
    public ContentViewHolder(View itemView) {
      super(itemView);
      this.itemView = itemView;
      mTitle = (TextView) itemView.findViewById(R.id.item_title);
      mDesc = (TextView) itemView.findViewById(R.id.item_desc);
      mTime = (TextView) itemView.findViewById(R.id.item_time);
      mHead = (ImageView) itemView.findViewById(R.id.item_head);
    }
  }

加载信息的ViewHolder


//加载更多的布局  (用于显示正在加载和没有更多
  private class LoadMoreViewHolder extends RecyclerView.ViewHolder {
    private ImageView mImage;
    private ProgressBar mProgress;
    private TextView mMsg;
    public LoadMoreViewHolder(View itemView) {
      super(itemView);
      mImage = (ImageView) itemView.findViewById(R.id.load_image);
      mProgress = (ProgressBar) itemView.findViewById(R.id.load_progress);
      mMsg = (TextView) itemView.findViewById(R.id.load_tv);
    }
  }

onCreateViewHolder中初始化不同的ViewHolder


  @Override
  public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = null;
    switch (viewType) {
      case 1:
        itemView = LayoutInflater.from(mContext).inflate(R.layout.load_layout, parent, false);
        return new LoadMoreViewHolder(itemView);
      case 2:
        itemView = LayoutInflater.from(mContext).inflate(R.layout.item_test, parent, false);
        return new ContentViewHolder(itemView);
    }
    return null;
  }

定义一个回调,用于当显示加载的时候通知activity更新数据


public interface onLoadMoreListener {
    void loadMore();
  }
  //全局变量
private onLoadMoreListener onLoadMoreListener;

onBindViewHolder(对不同的情况进行数据显示)


@Override
  public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    if (holder instanceof ContentViewHolder) {
      TestModel model = mDatas.get(position);
      ((ContentViewHolder) holder).mTitle.setText(model.getmTitle());
      ((ContentViewHolder) holder).mDesc.setText(model.getmDesc());
      ((ContentViewHolder) holder).mTime.setText(model.getmTime());
    } else if (holder instanceof LoadMoreViewHolder) {
      if (mDatas.size() < itemsCount) { //没有更多
        ((LoadMoreViewHolder) holder).mMsg.setText("没有更多了~~~");
        ((LoadMoreViewHolder) holder).mProgress.setVisibility(View.GONE);
        ((LoadMoreViewHolder) holder).mImage.setVisibility(View.VISIBLE);
      } else {
        onLoadMoreListener.loadMore();
        ((LoadMoreViewHolder) holder).mMsg.setText("正在加载更多....");
        ((LoadMoreViewHolder) holder).mProgress.setVisibility(View.VISIBLE);
        ((LoadMoreViewHolder) holder).mImage.setVisibility(View.GONE);
      }
    }
  }

加载更多的回调在Activity中的使用


mAdapter.setOnLoadMoreListener(new OneAdapter.onLoadMoreListener() {
    @Override
    public void loadMore() {
   //增加数据到数据源中
   //调用adapter的addData方法
   //更新适配器显示
  }
}

至此下拉刷新上拉加载就完成了,Demo地址:SwipeToRefreshTest。

以上就是Android自定义下拉刷新上拉加载的全部内容,希望能给大家一个参考,也希望大家多多支持编程网。

您可能感兴趣的文章:加载页面遮挡耗时操作任务页面--第三方开源之AndroidProgressLayoutAndroid开发中如何解决Fragment +Viewpager滑动页面重复加载的问题Android中替换WebView加载网页失败时的页面Android中自定义加载样式图片的具体实现Android自定义加载loading view动画组件Android自定义加载控件实现数据加载动画Android自定义view实现阻尼效果的加载动画Android自定义View实现loading动画加载效果Android自定义Dialog实现文字动态加载效果Android实现自定义加载框的代码示例Android开发实现自定义新闻加载页面功能实例


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android自定义下拉刷新上拉加载

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

下载Word文档

猜你喜欢

Android自定义下拉刷新上拉加载

本文实例为大家分享了Android自定义下拉刷新上拉加载的具体实现步骤,供大家参考,具体内容如下 实现的方式是SwipeRefreshLayout + RecyclerView 的VIewType 首先看效果:总的思路:布局文件
2022-06-06

Android自定义listview布局实现上拉加载下拉刷新功能

listview实现上拉加载以及下拉刷新的方式有很多。下面是我写的一种自定义的布局,复用性也比较的强。首先就是继承的listview的自定义view。 AutoListView.Java:package com.example.m
2022-06-06

Android RecyclerView自定义上拉和下拉刷新效果

使用RecyclerView越来越多了,基本可以不用listview了,但是这个新的控件谷歌官方似乎设计的没有想listview那样方便快捷,listview自带有headview和 footerview所有我们很方便的可以实现上拉,下拉刷
2022-06-06

Android RecyclerView上拉加载和下拉刷新

之前写过一篇刷新加载《RecyclerView上拉加载和下拉刷新(基础版)》 ,这次是进行改装完善。 代码中注释的很详细,所以就直接上代码了。 核心实现package com.example.fly.recyclerviewrefresh.
2022-06-06

Android RecyclerView下拉刷新和上拉加载更多

今天终于有点时间,来写了一下: 为RecyclerView实现下拉刷新和上拉加载更多。今天会在前面的两篇文章的基础上: RecyclerView系列之(1):为RecyclerView添加Header和Footer RecyclerView
2022-06-06

Android XListView下拉刷新和上拉加载更多

市面上有好多的类比ListView刷新数据的开源框架,如:v4包自带的SwipeRefreshLayout ,以及集ListView、GridView甚至WebView于一身的Pulltorefresh等等。前述的两个开源框架目前使用也算频
2022-06-06

Android RecyclerView实现下拉刷新和上拉加载

RecyclerView已经出来很久了,许许多多的项目都开始从ListView转战RecyclerView,那么,上拉加载和下拉刷新是一件很有必要的事情。 在ListView上,我们可以通过自己添加addHeadView和addFootVi
2022-06-06

Android ListView下拉刷新上拉自动加载更多DEMO示例

代码下载地址已经更新。因为代码很久没更新,已经很落伍了,建议大家使用RecyclerView实现。 参考项目:https://github.com/bingoogolapple/BGARefreshLayout-Androidhttps:/
2022-06-06

Android RecyclerView上拉加载和下拉刷新(基础版)

这里讲述的是用谷歌原生的SwipeRefreshLayout,进行刷新,以及利用RecycleView的滚动事件,判断是否到最后一个item,进行加载更多,这里加载更多是在RecycleView的适配器中使用不同item进行完成的。 这是a
2022-06-06

Android自定义ListView实现下拉刷新

首先呈上效果图当今APP,哪个没有点滑动刷新功能,简直就太落伍了。正因为需求多,因此自然而然开源的也就多。但是若想引用开源库,则很麻烦,比如PullToRefreshView这个库,如果把开源代码都移植到项目中,这是件很繁琐的事,如果用依赖
2022-06-06

Android自定义下拉刷新控件RefreshableView

这是在了解下拉刷新功能原理下的产物,下拉刷新可以说是国产APP里面必有的功能,连Google都为此出了SwipeRefreshLayout,一种MD风格的下拉刷新。 不过,MD风格在国内似乎很是艰难,不单单是国内系统主流仍是4.4的原因,
2022-06-06

android使用PullToRefresh实现下拉刷新和上拉加载

PullToRefresh是一套实现非常好的下拉刷新库,它支持: 1.ListView 2.ExpandableListView 3.GridView 4.WebView 等多种常用的需要刷新的View类型,而且使用起来也十分方便。 dem
2022-06-06

Android 仿硅谷新闻下拉刷新/上拉加载更多

1.添加加载更多布局 1_初始化和隐藏代码 在RefreshListView构造方法中调用private void initFooterView(Context context) { View footerView = View.infla
2022-06-06

Android RecyclerView实现下拉刷新和上拉加载更多

使用官方的刷新控件SwipeRefreshLayout来实现下拉刷新,当RecyclerView滑到底部实现下拉加载(进度条效果用RecyclerView加载一个布局实现) 需要完成控件的下拉监听和上拉监听,其中,下拉监听通过SwipRef
2022-06-06

Android控件PullRefreshViewGroup实现下拉刷新和上拉加载

本文实例为大家分享了Android实现下拉刷新和上拉加载更多的具体代码,供大家参考,具体内容如下 先分享下源码:Android实现下拉刷新和上拉加载更多 实现思路:由PullRefreshViewGroup控件来接管标准控件(比如Recyc
2022-06-06

Android仿XListView支持下拉刷新和上划加载更多的自定义RecyclerView

首先给大家展示下效果图,感觉还不错,请继续往下阅读: 下拉刷新: 上划加载 在项目更新的过程中,遇到了一个将XListView换成recyclerView的需求,而且更换完之后大体效果不能变,但是对于下拉刷新这样的效
2022-06-06

Android之下拉刷新和下拉加载(简单的)

Android之下拉刷新和下拉加载 我的是AndroidX,其他的没测过 我这个按钮是额外加的,请忽略最近才发现,还有好多好看的header(本条可忽略) 把上面那个header换成下面的更好玩 com.scwang.smartrefres
2022-06-06

Android下拉刷新上拉加载更多左滑动删除

一、前言老规矩,别的不说,这demo是找了很相关知识集合而成的,可以说对我这种小白来说是绞尽脑汁!程序员讲的是无图无真相! 现在大家一睹为快!二、比较关键的还是scroller这个类的package com.icq.slideview.vi
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录