iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android自定义下拉刷新上拉加载
  • 820
分享到

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

Android 2022-06-06 08:06:07 820人浏览 八月长安
摘要

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

本文实例为大家分享了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: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: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开发实现自定义新闻加载页面功能实例


--结束END--

本文标题: Android自定义下拉刷新上拉加载

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

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

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

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

下载Word文档
猜你喜欢
  • Android自定义ListView实现下拉刷新上拉加载更多
    目录1、创建刷新控件1.1、创建头部View1.2、下拉事件1.3、接口回调2、上拉加载更多2.1、底部样式2.2、布局添加Listview现在用的很少了,基本都是使用Recycle...
    99+
    2024-04-02
  • React Native如何自定义下拉刷新上拉加载的列表
    小编给大家分享一下React Native如何自定义下拉刷新上拉加载的列表,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在移动端...
    99+
    2024-04-02
  • Flutter实现下拉刷新和上拉加载更多
    本文实例为大家分享了Flutter实现下拉刷新和上拉加载更多的具体代码,供大家参考,具体内容如下 效果 下拉刷新 如果实现下拉刷新,必须借助RefreshIndicator,在li...
    99+
    2024-04-02
  • Android自定义实现淘宝下拉刷新效果
    要实现淘宝下拉刷新效果,可以使用RecyclerView和SwipeRefreshLayout来实现,具体步骤如下:1. 在布局文件...
    99+
    2023-08-17
    Android
  • Android怎么自定义实现下拉刷新效果
    Android中自定义实现下拉刷新效果可以通过自定义View或者使用第三方库来实现。1. 自定义View:- 创建一个继承自View...
    99+
    2023-08-18
    Android
  • Android如何通过XListView实现上拉加载下拉刷新功能
    小编给大家分享一下Android如何通过XListView实现上拉加载下拉刷新功能,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!具体内容如下## 导入XListVIew第三方库文件。通过LinkedList将刷新...
    99+
    2023-05-30
  • 小程序怎么实现上拉刷新下拉加载
    这篇文章主要介绍“小程序怎么实现上拉刷新下拉加载”,在日常操作中,相信很多人在小程序怎么实现上拉刷新下拉加载问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”小程序怎么实现上拉刷新下拉加载”的疑惑有所帮助!接下来...
    99+
    2023-06-26
  • MUI如何实现上拉刷新/下拉加载功能
    小编给大家分享一下MUI如何实现上拉刷新/下拉加载功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!新闻信息列表必备的功能,支持...
    99+
    2024-04-02
  • dropload.js插件下拉刷新和上拉加载怎么用
    小编给大家分享一下dropload.js插件下拉刷新和上拉加载怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体内容如下第...
    99+
    2024-04-02
  • 基于vue封装下拉刷新上拉加载组件
    基于vue和原生javascript封装的下拉刷新上拉加载组件,供大家参考,具体内容如下 upTilte插槽是下拉刷新的自定义内容放的地方 downTilte插槽是...
    99+
    2024-04-02
  • 在android应用中怎么添加一个上拉刷新下拉加载功能
    在android应用中怎么添加一个上拉刷新下拉加载功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。下拉刷新首先我们给出如下几个参数,后面要用:  pr...
    99+
    2023-05-31
    android roi
  • Android中的RecyclerView下拉/上拉刷新数据
            在Android中的列表视图(我们这里以RecyclerView为例)中有很多数据的时候,往往要采取限制数据条目显示,然后通过刷新再添加新的数据显示,这样看的就会比较美观,那么这种列表视图是怎么实现刷新的呢,我们一起来看看吧...
    99+
    2023-09-07
    android
  • 原生js实现下拉刷新和上拉加载更多
    本文实例为大家分享了js实现下拉刷新和上拉加载更多的具体代码,供大家参考,具体内容如下 1.下拉刷新 由于原生js太久不用了,这里列一下此处涉及到的前置知识点: 移动端触屏事件: t...
    99+
    2024-04-02
  • uniapp怎么实现下拉刷新和上拉加载功能
    随着移动端开发的不断升级,开发者们对于移动应用的需求也越来越高。而在很多移动应用中,下拉刷新和上拉加载更多是必不可少的功能之一,为了提高用户体验,许多移动应用都会加入这两个功能。在这里,我们将介绍如何在uniapp中实现下拉刷新和上拉加载更...
    99+
    2023-05-14
  • AndroidFlutter实现自定义下拉刷新组件
    目录前言改造点DIY下拉组件样式刷新时机调整效果展示前言 在Flutter开发中官方提供了多平台的下拉刷新组件供开发者使用,例如RefreshIndicator和CupertinoS...
    99+
    2024-04-02
  • Spring怎么实现上拉刷新和下拉加载效果
    这篇文章主要介绍Spring怎么实现上拉刷新和下拉加载效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!导依赖:compile 'com.android.support:recyclerview-v...
    99+
    2023-05-30
    spring
  • MUI如何实现上拉加载和下拉刷新效果
    这篇文章主要介绍了MUI如何实现上拉加载和下拉刷新效果,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。编写存储过程分页(此处使用T-SQL)C...
    99+
    2024-04-02
  • 浅谈Vant-list 上拉加载及下拉刷新的问题
    目录Vant-list 上拉加载及下拉刷新vant下拉刷新与上拉加载一起使用问题下拉刷新触发两次 list与pull解决方法是Vant-list 上拉加载及下拉刷新 第一步引入 im...
    99+
    2024-04-02
  • Android SwipereFreshLayout下拉刷新
    Android SwipereFreshLayout下拉刷新我们都知道现在android5.0以后就提倡使用Material Design设计了。在Material Design设计就有一个非常好的设计SwipereFreshLayout,...
    99+
    2023-05-31
    android swiperefreshlayout 下拉刷新
  • Vue uni-app框架实现上拉加载下拉刷新功能
    目录实现上拉加载更多优化实现下拉刷新实现上拉加载更多 打开项目根目录中的pages.json配置文件,为subPackages分包中的商品goods_list页面配置上拉触底的距离:...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作