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

Android-自定义控件之ListView下拉刷新的实现

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

Android-自定义控件之ListView下拉刷新的实现

自定义控件学了很久了,发现学了总是忘,于是打算用博客来记录自己学习的知识点。

今天是自定义ListView来实现下拉刷新,这些文章都是借鉴慕课网上的视频来写的.

自定义一个控件,先是看它继承于那个控件,如果我们继承View控件的话,那得让我们写很多关于ListView的功能,这些东西我自己觉得很麻烦,而且也没有那个必要因为我们可以直接继承ListView,在listView的基础上来加一些我们需要的东西。

1.向ListView加Header布局


  private void initView(Context context)
  {
    mLayoutInflater = LayoutInflater.from(context);
    mHeaerView = mLayoutInflater.inflate(R.layout.header_layout, null, false);
    addHeaderView(mHeaerView);
  }

2.隐藏Header布局


private void initView(Context context) {
    mLayoutInflater = LayoutInflater.from(context);
    mHeaerView = mLayoutInflater.inflate(R.layout.header_layout, null, false);
    measureView(mHeaerView);
    mHeaderViewHeight = mHeaerView.getMeasuredHeight();
    setHeaderViewHeightPadding(mHeaderViewHeight);
    Log.i("main", mHeaderViewHeight + "");
    addHeaderView(mHeaerView);
  }
  private void measureView(View view)
  {
    ViewGroup.LayoutParams lp = view.getLayoutParams();
    if(lp == null)
    {
      lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    }
    //mHeaerView.measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    
    int width = ViewGroup.getChildMeasureSpec(0,0,lp.width);
    int height = 0;
    int tempHeight = lp.height;
    if(tempHeight > 0)
    {
      height = MeasureSpec.makeMeasureSpec(tempHeight, MeasureSpec.EXACTLY);
    }
    view.measure(width, height);
  }
  private void setHeaderViewHeightPadding(int padding) {
    mHeaerView.setPadding(mHeaerView.getPaddingLeft(), -padding, mHeaerView.getPaddingRight(), mHeaerView.getPaddingBottom());
    mHeaerView.invalidate();
  }

3.实现ListView的下拉刷新(一)

要想实现ListView的下拉刷新,必须监听ListView是否滑动到最顶端,因此要实现ListView的监听接口OnScrollListener,并且要监听ListView的OnTouch事件。根据滑动的情况来判断刷新的情况。

首先我们在定义了一个成员变量来保存ListView的状态--mState

其次定义了几个静态常量来表示不同的状态  


 private final static int NONE = 0; // 无状态
  private final static int DOWN_UPDATE = 1; // 提示下拉可以刷新
  private final static int UPDATE = 2; // 提示松开可以刷新
  private final static int REFLASH = 3; // 更新

最后则是根据不同的滑动来更改mState的状态


@Override
  public boolean onTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
      case MotionEvent.ACTION_DOWN: {
        if (mFirstVisibleItem == 0) {
          mIsRemark = true; // mIsRemark只是一个标记,表示当前可见的第一个Item是不是所有的Item中的第一个
          mStartY = (int) ev.getY();
          Log.i("main", "我进来了");
        }
        break;
      }
      case MotionEvent.ACTION_MOVE: {
        onMove(ev);
        tempY = (int) (ev.getY() - mStartY);
        Log.i("main", "tempY = " + tempY);
        break;
      }
      case MotionEvent.ACTION_UP: {
        if(mState == DOWN_UPDATE)
        {
          mState = NONE;
        }
        if(mState == UPDATE)
        {
          mState = REFLASH;
          mListener.reFlash();
          Log.i("main", "我来了");
        }
        Log.i("main", "tempY11 = " + tempY);
        if(tempY <= 0 && mIsRemark)
        {
          Log.i("main", "我进来le");
          mState = NONE;
        }
        change();
        break;
      }
    }
    return super.onTouchEvent(ev);
  }
  private void onMove(MotionEvent ev) {
    if (mIsRemark) {
      if (ev.getY() - mStartY > 0) {
        int dy = (int) (ev.getY() - mStartY);
        if (dy > mHeaderViewHeight + 20) {
          mState = UPDATE;
        } else {
          mState = DOWN_UPDATE;
        }
        setHeaderViewHeightPadding(mHeaderViewHeight - dy);
        change();
      }
      return;
    }
    return;
  }

  private void change() {
    initChildView();
    RotateAnimation ani = new RotateAnimation(0, 180, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f);
    ani.setDuration(500);
    ani.setFillAfter(true);
    RotateAnimation ani1 = new RotateAnimation(180, 0, RotateAnimation.RELATIVE_TO_SELF, 0.5f, RotateAnimation.RELATIVE_TO_SELF, 0.5f);
    ani1.setDuration(500);
    ani1.setFillAfter(true);
    if (mState == UPDATE)
    {
      mProgressBar.setVisibility(View.GONE);
      mImageView.setVisibility(View.VISIBLE);
      mImageView.clearAnimation();
      mImageView.setAnimation(ani);
      mTextViewFlash.setText("松开可以刷新!");
      mTextViewTime.setVisibility(View.VISIBLE);
      mTextViewTime.setText("上次更新的时间:" + mUpdateTime);
    }
    if (mState == DOWN_UPDATE)
    {
      mProgressBar.setVisibility(View.GONE);
      mImageView.setVisibility(View.VISIBLE);
      mTextViewTime.setVisibility(View.VISIBLE);
      mImageView.clearAnimation();
      mImageView.setAnimation(ani1);
      mTextViewFlash.setText("下拉可以刷新");
      mTextViewTime.setText("上次更新的时间:" + mUpdateTime);
    }
    if (mState == REFLASH)
    {
      setHeaderViewHeightPadding(10);
      mProgressBar.setVisibility(View.VISIBLE);
      mImageView.setVisibility(View.GONE);
      mTextViewTime.setVisibility(View.GONE);
      mTextViewFlash.setText("正在刷新...");
      mImageView.clearAnimation();
    }
    if(mState == NONE)
    {
      Log.i("main", "workspace");
      setHeaderViewHeightPadding(mHeaderViewHeight);
      mIsRemark = false;
      mProgressBar.setVisibility(View.GONE);
      mImageView.setVisibility(View.VISIBLE);
      mImageView.setAnimation(ani1);
    }
  }
  private void initChildView()
  {
    if(mTextViewFlash == null)
    {
      mTextViewFlash = (TextView) mHeaerView.findViewById(R.id.id_textView_Flash);
    }
    if(mTextViewTime == null)
    {
      mTextViewTime = (TextView) mHeaerView.findViewById(R.id.id_textView_Time);
    }
    if(mImageView == null)
    {
      mImageView = (ImageView) mHeaerView.findViewById(R.id.id_imagView);
    }
    if(mProgressBar == null)
    {
      mProgressBar = (ProgressBar) mHeaerView.findViewById(R.id.id_progressbar);
    }
  }

4.实现ListView的下拉刷新(二)

 经过上面的过程,是可以下拉的,处理不同状态下的事件。还有一个问题就是刷新,也就是加载新的数据。加载刷新的操作肯定必须在UI线程中,因此ListView中必须得有一个回调接口,用来MinaActivity来实现,并且来进行一些操作。

  回调接口:


  public void setOnFlashListener(FlashListener listener)
  {
    this.mListener = listener;
  }
  public interface FlashListener
  {
    void reFlash();
  }

回调接口的调用:


        if(mState == UPDATE)
        {
          mState = REFLASH;
          mListener.reFlash();
          Log.i("main", "我来了");
        }

MainActivity中回调接口的实现和接口方法的实现:


mListView.setOnFlashListener(new FlashListView.FlashListener() {
      @Override
      public void reFlash() {
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
          @Override
          public void run() {
            addDatas();
            loadDatas();
            mListView.reFalshComplete();
          }
        }, 5000);
      }
    });
 private void addDatas()
  {
    int i = mDatas.size();
    for(int j = i; j < i + 10; j++)
    {
      mDatas.add(new Bean("Title" + j, "Content" + j, R.mipmap.ic_launcher));
    }
    myAdapter.dataChange(mDatas);
  }
  private void loadDatas()
  {
    mListView.setAdapter(myAdapter);
  }
您可能感兴趣的文章:Android使用ListView实现下拉刷新及上拉显示更多的方法Android自定义渐变式炫酷ListView下拉刷新动画Android中Listview下拉刷新和上拉加载更多的多种实现方案Android ListView实现上拉加载下拉刷新和滑动删除功能Android自定义listview布局实现上拉加载下拉刷新功能Android中ListView下拉刷新的实现代码


免责声明:

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

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

Android-自定义控件之ListView下拉刷新的实现

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

下载Word文档

猜你喜欢

Android-自定义控件之ListView下拉刷新的实现

自定义控件学了很久了,发现学了总是忘,于是打算用博客来记录自己学习的知识点。 今天是自定义ListView来实现下拉刷新,这些文章都是借鉴慕课网上的视频来写的. 自定义一个控件,先是看它继承于那个控件,如果我们继承View控件的话,那得让我
2022-06-06

Android自定义ListView实现下拉刷新

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

Android自定义控件开发实战之实现ListView下拉刷新实例代码

这篇博客为大家介绍一个android常见的功能——ListView下拉刷新:首先下拉未松手时候手机显示这样的界面:下面的代码是自定的扎样的控件:2022-06-06

Android自定义下拉刷新控件RefreshableView

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

Android自定义控件下拉刷新实例代码

实现效果:图片素材:--> 首先, 写先下拉刷新时的刷新布局 pull_to_refresh.xml:PullToRefreshTest
2022-06-06

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

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

Android仿新浪微博自定义ListView下拉刷新(4)

自定义PullToRefreshListView继承ListView,在ListView头部添加一个下拉的头部布局。跟ListView用法完全一致。该自定义Listview代码详解具体可参考: //www.jb51.net/article/
2022-06-06

Android UI自定义ListView实现下拉刷新和加载更多效果

关于实现ListView下拉刷新和加载更多的实现,我想网上一搜就一堆。不过我就没发现比较实用的,要不就是实现起来太复杂,要不就是不健全的。因为小巫近期要开发新浪微博客户端,需要实现ListView的下拉刷新,所以就想把这个UI整合到项目当中
2022-06-06

Android中怎么通过自定义控件实现下拉刷新效果

本篇文章给大家分享的是有关Android中怎么通过自定义控件实现下拉刷新效果,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。@Override protected void o
2023-05-30

Android自定义组合控件之自定义下拉刷新和左滑删除实例代码

绪论 最近项目里面用到了下拉刷新和左滑删除,网上找了找并没有可以用的,有比较好的左滑删除,但是并没有和下拉刷新上拉加载结合到一起,要不就是一些比较水的结合,并不能在项目里面使用,小编一着急自己组合了一个,做完了和QQ的对比了一下,并没有太大
2022-06-06

Android自定义渐变式炫酷ListView下拉刷新动画

本文实例为大家分享了自定义渐变式炫酷动画的ListView下拉刷新,供大家参考,具体内容如下 主要要点 listview刷新过程中主要有三个步骤当前:状态为下拉刷新,当前状态为下拉刷新,当前状态为放开刷新,当前状态为正在刷新;主要思路为三个
2022-06-06

Android控件RefreshableView实现下拉刷新

需求:自定义一个ViewGroup,实现可以下拉刷新的功能。下拉一定距离后(下拉时显示的界面可以自定义任何复杂的界面)释放手指可以回调刷新的功能,用户处理完刷新的内容后,可以调用方法onCompleteRefresh()通知刷新完毕,然后回
2022-06-06

Android怎么自定义实现下拉刷新效果

Android中自定义实现下拉刷新效果可以通过自定义View或者使用第三方库来实现。1. 自定义View:- 创建一个继承自ViewGroup的自定义View,重写onTouchEvent方法来监听手势操作。- 在onTouchEvent方
2023-08-18

Android自定义实现淘宝下拉刷新效果

要实现淘宝下拉刷新效果,可以使用RecyclerView和SwipeRefreshLayout来实现,具体步骤如下:1. 在布局文件中添加SwipeRefreshLayout和RecyclerView组件。```xmlandroid:id=
2023-08-17

android开发教程之实现listview下拉刷新和上拉刷新效果

代码如下:public class PullToLoadListView extends ListView implements OnScrollListener { private static final String TAG = P
2022-06-06

Android中ListView下拉刷新的实现方法

ListView中的下拉刷新是非常常见的,也是经常使用的,看到有很多同学想要,那我就整理一下,供大家参考。那我就不解释,直接上代码了。这里需要自己重写一下ListView,重写代码如下:package net.loonggg.listvie
2022-06-06

Android中ListView下拉刷新的实现代码

Android中ListView下拉刷新实现效果图:ListView中的下拉刷新是非常常见的,也是经常使用的,看到有很多同学想要,那我就整理一下,供大家参考。那我就不解释,直接上代码了。这里需要自己重写一下ListView,重写代码如下:p
2023-05-31

Android自定义View控件实现刷新效果

三种得到LinearInflater的方法 a. LayoutInflater inflater = getLayoutInflater(); b. LayoutInflater localinflater = (LayoutInflate
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第一次实验

目录