下拉刷新ListView

Android中ListView下拉刷新功能 效果图: 项目结构: 代码: 自定义listView ReFlashListView package com.zhh.refreshlistview; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.vi 阅读详情

下拉刷新ListView

PullToRefreshListView

原理:
拉刷新ListView无非就是对普通的List View添加一个HeaderView,然后通过对ListView onTouchEvent来获取当前下拉刷新的状态。然后去改变HeaderView的状态。

  1. 自定义ListView,在构造方法中去添加HeaderView
    通过ListView.addHeaderView()去添加HeaderView的时候,HeaderView会显示在屏幕的最初位置,我们需要它默认的时候是在屏幕的上方,这样默认时是不可见的,
    但是我们下拉ListView的时候,它就能够显示出来。这就要通过设置HeaderView的padding来实现它的隐藏。注意:View的显示最初要经过Measure测量宽高,
    我们在构造方法去添加的时候,该View可能并没有被测量,所以在获取HeaderView高度的时候会为0,这时候我们要手动的去测量一下HeaderView。

    /**
    * 当前状态
    */
    private State mState = State.ORIGNAL;
    
    public PullToRefreshListView(Context context, AttributeSet attrs,
            int defStyle) {
        super(context, attrs, defStyle);
        initView(context);
    }
    
    public PullToRefreshListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView(context);
    }
    
    public PullToRefreshListView(Context context) {
        super(context);
        initView(context);
    }
    
    private void initView(Context context) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    
        mHeader = inflater.inflate(R.layout.pull_to_refresh_header, null);
        iv_arrow = (ImageView) mHeader.findViewById(R.id.iv_arrow);
        pb_refresh = (ProgressBar) mHeader.findViewById(R.id.pb_refresh);
        tv_title = (TextView) mHeader.findViewById(R.id.tv_title);
        tv_time = (TextView) mHeader.findViewById(R.id.tv_time);
    
        measureHeaderView(mHeader);
    
        mHeaderHeight = mHeader.getMeasuredHeight();
        // To make header view above the window, so use -mHeaderHeight.
        mHeader.setPadding(0, -mHeaderHeight, 0, 0);
    
        mHeader.invalidate();
    
        addHeaderView(mHeader);
    }
    
    /**
     * 下拉刷新所有的状态
     */
    public enum State {
        ORIGNAL, PULL_TO_REFRESH, REFRESHING, RELEASE_TO_REFRESH;
    }
  2. 重写onTouchEvent,来监听手指的下拉

    public boolean onTouchEvent(MotionEvent ev) {
        int y = (int) ev.getRawY();
        int action = ev.getAction();
        switch (action) {
        case MotionEvent.ACTION_DOWN:
            //记录手指点下的位置
            downPositionY = y;
            break;
        case MotionEvent.ACTION_MOVE:
            //手指当前滑动的位置
            currentPositionY = y;
            //手指移动的距离,由于HeaderView高度固定,但是手指下拉的高度可以最大为屏幕的高度,如手指下拉屏幕高度时,HeaderView会很难看,
            // 所以我们让下拉的距离进行一个缩放。
            pullDistance = (currentPositionY - downPositionY) / RATIO;
    
            if (mState == State.REFRESHING) {
                break;
            } else if (mState == State.ORIGNAL && pullDistance > 0) {
                //如果现在处理起始的状态,并且距离大于0,就说明是下拉了,这时候状态需要变为下拉刷新的状态
                mState = State.PULL_TO_REFRESH;
                changeState();
            } else if (mState == State.PULL_TO_REFRESH
                    && pullDistance > mHeaderHeight) {
                //当时为下拉刷新的状态,但是下拉的距离大于HeaderView的高度。这时状态要变为松手即可刷新
                mState = State.RELEASE_TO_REFRESH;
                changeState();
            } else if (mState == State.RELEASE_TO_REFRESH) {
            //释放刷新时有三种情况,一是我继续下啦,这时候不用管,因为继续下拉还是释放刷新。二是我手指往上移动,此时HeaderView不完全可见,
            // 这时候状态要改变为下拉刷新了。三是我手指上移的很厉害,导致HeaderView完全不可见了,这是状态要改变为起始状态。
                if (pullDistance < 0) {
                    // 如果当时状态为松手刷新,但是这时候我并没有松手,而是直接将手指往上移动,移动回手指最先的位置,这时候状态要变为起始状态。
                    mState = State.ORIGNAL;
                    changeState();
                } else if (pullDistance < mHeaderHeight) {
                    //手指上移,但是并没有移动到HeaderView完全不可见,这时候要将状态改变为下拉刷新
                    mState = State.PULL_TO_REFRESH;
                    isBack = true;
                    changeState();
                }
    
            }
    
            //在移动的过程中不断的去改版Padding的值,控制其显示的大小
            if (mState != State.REFRESHING) {
                mHeader.setPadding(0, (int) (pullDistance - mHeaderHeight), 0,
                        0);
            }
    
            break;
        case MotionEvent.ACTION_UP:
            if (mState == State.REFRESHING) {
                //如果当前已经是正在刷新中了,再去下拉就不要处理了
                break;
            } else if (mState == State.PULL_TO_REFRESH) {
                //显现下拉刷新时,松手了,这时候要将其改为起始状态
                mState = State.ORIGNAL;
            } else if (mState == State.RELEASE_TO_REFRESH) {
                //松手刷新时松手了,这时候状态要变为正在刷新中。
                mState = State.REFRESHING;
            } else {
                break;
            }
            changeState();
            break;
    
        default:
            break;
        }
    
        return super.onTouchEvent(ev);
    }
  3. 上面的写法仍有些问题。就是我们在onTouchEvent中Move里面对移动的距离进行了判断,但是ListView本身就是一个可以上下滑动的组件,
    如果我们直接这样判断,那ListView本上上下滑动的功能就被我们给抹去了。

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        int y = (int) ev.getRawY();
        int action = ev.getAction();
        switch (action) {
        case MotionEvent.ACTION_DOWN:
            downPositionY = y;
            break;
        case MotionEvent.ACTION_MOVE:
            //一定要加上这句话,来判断当前是否可以下拉刷新
            if (!isCanPullToRefresh) {
                break;
            }
            .....
            break;

    而对于isCanPullToRefresh的判断是通过ListView.setOnScrollListener去进行判断当前第一个可见条目是不是ListView的第一个条目,
    只有第一个条目在最顶端位置的时候才可以进行下拉刷新。

    super.setOnScrollListener(new OnScrollListener() {
    
        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
        }
    
        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {
    
            if (firstVisibleItem == 0) {
                isCanPullToRefresh = true;
            } else {
                isCanPullToRefresh = false;
            }
        }
    });
  4. 提供刷新接口

    public interface OnRefreshListener {
        abstract void onRefresh();
    }
  5. ChangeState方法

    /**
     * Change the state of header view when ListView in different state.
     */
    private void changeState() {
        //在该方法中对mState进行判断,根据不同状态作出处理,并且去调用刷新方法
    }
    
    /**
     *数据刷新完成后需要调用此方法去恢复装填
     */
    @SuppressWarnings("deprecation")
    public void onRefreshComplete() {
        mState = State.ORIGNAL;
        changeState();
        tv_time.setText(getResources().getString(R.string.update_time)
                + new Date().toLocaleString());
    }

LoadMoreListView

原理:
滑动到底部自动加载更多的ListView,无非就是通过对其滑动过程进行监听,一旦滑动到底部的时候我们就去加载新的数据。通过对ListView添加FooterView,
然后在不同的状态控制它的显示与隐藏。

  1. 自定义ListView的子类,在构造方法中去添加FooterView.

    public class LoadMoreListView extends ListView {
    
    public LoadMoreListView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context);
    }
    
    public LoadMoreListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }
    
    public LoadMoreListView(Context context) {
        super(context);
        init(context);
    }
    
    private void init(Context context) {
        mFooterView = View.inflate(context, R.layout.load_more_footer, null);
        addFooterView(mFooterView);
        hideFooterView();
    }
  2. 监听滑动状态,通过setOnScrollListener即可实现对状态的监听。

    private void init(Context context) {
        mFooterView = View.inflate(context, R.layout.load_more_footer, null);
        addFooterView(mFooterView);
        hideFooterView();
        //为了防止在使用时调用setOnScrollListener会覆盖此时设置的Listener,我们在此使用super.setOnScrollListenr()
        super.setOnScrollListener(superOnScrollListener);
    }
  3. 在ScrollListener中去判断当前滑动的状态。从而依据不同的状态去控制FooterView的显示与隐藏。

    private OnScrollListener superOnScrollListener = new OnScrollListener() {
    
        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            mCurrentScrollState = scrollState;
        }
    
        @Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {
            if (visibleItemCount == totalItemCount) {
                //此时说明当前ListView所有的条目比较少,不足一屏
                hideFooterView();
            } else if (!mIsLoading
                    && (firstVisibleItem + visibleItemCount >= totalItemCount)
                    && mCurrentScrollState != SCROLL_STATE_IDLE) {
                //当第一个可见的条目位置加上当前也所有可见的条目数 等于 ListView当前总的条目数时,就说明已经滑动到了底部,这时候就要去显示FooterView。
                showFooterView();
                mIsLoading = true;
                if (mOnLoadMoreListener != null) {
                    mOnLoadMoreListener.onLoadMore();
                }
            }
        }
    };
  4. 提供自动加载更多的接口。

    public interface OnLoadMoreListener {
        /**
         * Load more data.
         */
        void onLoadMore();
    }

在使用的时候,与ListView使用方法相同,只需调用setOnLoadMoreListener对其设置OnLoadMoreListener即可,然后在数据加载完成后调用onLoadComplete方法去恢复状态。

PullAndLoadMoreListView

将下拉刷新和自动加载更多进行整合。就不多说了


  • 邮箱 :charon.chui@gmail.com
  • Good Luck!
Android scrollview中嵌套listview实现listview的下拉刷新上拉加载更多 在Android中 scrollview中嵌套listview实现listview的下拉刷新上拉加载更多 阅读详情

相关推荐

Android ListView下拉刷新技术实现

本文还有配套的精品资源,点击获取 简介:在Android开发中,ListView是展示列表数据的常用组件。为了提升用户体验,实现下拉刷新功能让获取最新数据变得简单。本文将详细介绍如何实现ListView的下拉刷新功能,包括对下拉刷新概念的解释、郭林提出的基于SwipeRefreshLayout的实现方法、自定义下拉刷新效果的技术要点,以及实现过程中应注意的事项。通过学习本文...

weixin_35750953的博客 1309

ListView下拉刷新

ListView下拉刷新 1.自定义ListView类 import android.content.Context; import android.os.Handler; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; import android.widget.ImageView; import

qq_44408913的博客 551

实现Android ListView下拉刷新与上拉加载的实战示例

Android的ListView组件是一种可滚动的列表视图,它允许多项数据在垂直滚动的列表形式中进行展示。开发者可以使用它来展示一个项目列表,用户可以通过滚动来查看列表中的所有项目。ListView非常适合用于数据项展示较多的场景,其性能优化和自定义性在Android应用开发中扮演着重要角色。下拉刷新功能允许用户通过在ListView或RecyclerView等滚动组件的顶部下拉动作来刷新数据。在Android中,触发下拉刷新一般依赖于用户的手势动作。

weixin_29069575的博客 1121

List 列表配合PullRefresh 实现:下拉刷新,上拉加载更多

<van-list v-model="loading" :finished="finished" finished-text="-- 暂无更多数据 --" @load="onLoad" class="list"> <div> <ul> <li v-for="(item,index) in list" :key...

sunluyi的博客 1050

Android ListView下拉刷新完整指南

本文还有配套的精品资源,点击获取 简介:在移动应用中实现ListView下拉刷新功能,需要使用SwipeRefreshLayout组件,处理适配器更新和自定义Header视图,以提供最新的数据。本指南将详细介绍如何实现这一功能,包括初始化SwipeRefreshLayout,设置下拉监听器,异步加载数据,更新ListView适配器以及可能的Header视图自定义。通过实际示...

weixin_42596011的博客 1387

android list下拉刷新

android list下拉刷新

关于List的下拉刷新与加载更多的组合

为了快速开发,简单实用的listview,并且有效的保持代码风格的简单清晰明了,对ListView的常用下拉刷新和加载更多进行了组合。 保持了ListView的原有特性。 1、管理下拉刷新的主要接口:    IFresh 2、管理加载更多的主要接口: IFooter 3、重要的中间组合类: BinderListView 常用开发中,主要实现3个方法,见IList。 UML如下图: d

穆雨-札记 494

Windows11下QGIS 3.34.4安装Geo-SAM插件全流程(附RTX3060 CUDA12.0配置技巧)

本文详细介绍了在Windows 11系统中为QGIS 3.34.4安装和配置Geo-SAM插件的完整流程,特别针对RTX 3060显卡用户提供了CUDA 12.0与PyTorch环境的精准搭建方案。通过预编码与交互式分割两大核心步骤,该插件能显著提升遥感图像半自动标注的效率,降低硬件门槛,是地理信息处理领域融合AI技术的实用指南。

weixin_29089057的博客 297

list下拉刷新

隐藏header                 measureView(header); headerHeight = header.getMeasuredHeight();//getMeasuredHeight:是用于测量的高度,也就是View实际的高度 Log.i("tag", "headerHeight = " + headerHeight); topPadding(-header

静下心来吧,让自己变强大点! 620

深入解析音频信号处理的核心算法——傅里叶变换、语音增强、回声消除与主动降噪

本文系统介绍了现代音频信号处理的核心技术。首先阐述傅里叶变换作为理论基础的重要性,它能将声音分解为频域成分。随后重点分析三大关键技术:语音增强利用谱减法、维纳滤波和深度学习从噪声中提取人声;回声消除采用自适应滤波器消除通话中的回声;主动降噪通过声波干涉原理抵消环境噪声。文章最后指出,这些技术在实际应用中协同工作,形成完整的音频处理链路,共同提升语音质量和听觉体验。随着算法进步和算力提升,音频处理技术正向着更智能、更高效的方向发展。

程序猿老樊的博客 1331

EM4095低频RFID曼彻斯特解码实战:从原理图到MCU代码实现

本文详细介绍了EM4095低频RFID读卡器的设计与实现,从芯片工作原理、天线设计到曼彻斯特解码算法。重点讲解了基于STM32的MCU代码实现,包括定时器捕获、数字滤波和错误处理,为开发125kHz RFID系统提供实用指南。

oil88的博客 717

FLUTTER 自己动手对LISTVIEW添加下拉刷新

material实际上自带有下拉刷新控件,不过既然是学习就自己实现一个,这里是实现一个IOS中比较常见的tableviewHeader式的下拉刷新控件 。效果类似于MJNormalHeader。 先踩个坑 在做下拉刷新的时候,我首先是利用滚动控件拉出滚动范围时,利用offset做处理。 也实现了,在IOS端listview有弹簧效果,因此会被拉出负的offset,但是在安卓端运行时弹簧效果却会被...

importIng的博客 817

AI游戏制作07——波次计时器,敌人按波次生成

AI游戏制作07——波次计时器,敌人按波次生成

qq_40572023的博客 48

android listview如何添加下拉刷新上拉加载

我整理的一些关于【上拉加载,下拉刷新,List】的项目学习资料(附讲解~~)和大家一起分享、学习一下:https://d.51cto.com/bLN8S1Android ListView 如何添加下拉刷新和上拉加载 在Android开发中,ListView是一个非常常见的组件,用于展示纵向滚动的列表数据。然而,在用户体验...

weixin_40610471的博客 224

嵌入式STM32F407CET6移植OpenHarmony系统方法

文件末尾添加:export PATH=~/gcc-arm-none-eabi-10-2020-q4-major/bin:$PATH。编译完成文件输出在LiteOs源码目录下out/STM32F407_ATK_Explorer文件夹中。②点击connect to the target,下方会自动显示识别出来的芯片型号以及flash大小。⑤点击program verify并点击start,等待烧写并校验完成,你就能看到程序正在运行了。,在选择刚才我们说的Huawei_LiteOS.hex文件。

嵌入式技术开发 547

Qt5.15.2配置安卓环境

否则,将会跳转到github,你可以自行下载解压到你设置的目录中,然后Qt会自动检测到。以上所需的工具确实有些繁多,而且如果单独下载又涉及科学上网问题,版本问题十分麻烦,好在Qt Creator 4.12之后已经可以自动下载SDK工具,NDK,基础包,openssl,以及gradle等,十分省心。回到正题,无论通过在线安装的方式,安装时勾选了Android,还是编译的方式,编译时编译了Qt Android库,想要使用Qt开发安卓应用仍然需要一些其他工作,包括安装编译安卓项目需要的SDK,NDK等。

weixin_41392061的博客 980

自己实现一个下拉刷新的ListView

效果: 实现一个下拉刷新的ListView 1.确定状态 下拉刷新的ListView一共有四种状态,分别是 常态(刷新完成或者是正常展示的时候)正在下拉但是下拉的距离没有达到我们定义的可以刷新的距离(下拉可以刷新)下拉的距离达到了可以刷新的距离(释放立即刷新)正在刷新 2.确定实现方案 我们用一个FrameLayout包裹一个下拉刷新的头布局和一个ListV

YanRu的专栏 2027

NLP高频面试题(一)——Transformer的基本结构、作用和代码实现

本文详细介绍了Transformer模型的基本结构和PyTorch代码实现过程。首先解析了Transformer的核心组成部分,包括嵌入层、多头自注意力机制、位置编码、前馈神经网络、编码器和解码器等模块,并通过清晰的代码示例逐步展示了如何在PyTorch中构建完整的Transformer模型。文末提供了一个可运行的简单示例,帮助读者快速理解并实践Transformer的核心原理与实现方法。

WeLearnNLP 1026

带有下拉刷新功能的Listview控件

带有下拉刷新功能的Listview控件

qq_44910624的博客 148

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Qt Quick之ListView下拉刷新数据

Qt Quick里的ListView,本身是Flickable的派生类,当你用鼠标拖曳或者手指触摸(触摸屏)时,会产生flickStarted和flickEnded两个信号,利用这两个信号,就可以实现下拉刷新数据,当然上拉刷新也是可以的。

安晓辉生涯——聚焦程序员的职业规划与成长 1万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

android 下拉刷新listview,Android中常见的下拉刷新ListView

下拉刷新在越来越多的应用程序中使用,它已经形成了默认的用户习惯,当遇到列表中显示的内容时,用户开始习惯性地下拉,那么中常见的下拉刷新ListView有哪些呢?下面就让爱站技术频道小编带你一起进入下文了解一下吧!在交互习惯上已经形成定性。之前在我的文章《IOS学习笔记34—EGOTableViewPullRefresh实现下拉刷新》中介绍过如何在IOS上实现下拉刷新的功能。今天主要介绍下在Andro...

weixin_42292183的博客 615

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Android中ListView下拉刷新的实现

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

非著名程序员 11万+

安卓下如何实现listview下拉刷新

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

YiRanAiNi_的博客 774
上一篇: 锁屏以及解锁监听
下一篇: 应用安装
CharonChui
博客等级 码龄12年 66粉丝 134原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值