ListView学习(二)

ListView学习(二)-ListView缓存机制 ListView作为列表,可以显示成百上千个item。如果有多少数据,就创建多少个item,会占用很大内存,但是大多数item并没有显示在屏幕上,造成了内存浪费,所以移除屏幕的view就可以缓存起来,以便下次重用。这里就探究下ListView是如何缓存的。 阅读详情

### ListView 的滑动监听事件

OnTouchListener

OnTouchListener 是 View 中的监听事件,通过 ACTION_DOWN、ACTION_MOVE、ACTION_UP 这三个事件发生时的坐标,就可以根据坐标判断用户滑动的方向,并在不同的事件中进行相应的逻辑处理:

“`java

mListView.setOnTouchListener(new View.OnTouchListener(){

    @Override
    public boolean onTouch(View v, MotionEvent event){
        switch(event.getAction()){
            case MotionEvent.ACTION_DOWN : 
                //触摸操作
                break;
            case MotionEvent.ACTION_MOVE :
                //滑动操作
                break;
            case MotionEvent.ACTION_UP :
                //离开时操作
                break;
        }
    }
});

“`

OnScrollListener

OnScrollListener 是 AbsListView 中的监听事件,它封装了很多与ListView 相关的信息,使用起来也更加的灵活。


 mListView.setOnScrollLinstener(new OnScrollListener(){
     @Override
     public void onScrollStateChanged(AbsListView view, int scrollState){
        switch(scrollState){
            case OnScrollListener.SCROLL_STATE_IDLE : 
                //滑动停止时
                Log.d("TAG","SCROLL_STATE_IDLE");
                break;
            case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL :
                //正在滑动
                Log.d("TAG","SCROLL_STATE_TOUCH_SCROLL");
                break;
            case OnScrollListener.SCROLL_STATE_FLING : 
                //手指抛动的时候,就是快速滑动
                //在手指离开屏幕后 ListView 由于惯性继续滑动
                Log.d("TAG","SCROLL_STATE_FLING");
                break;
        }

        @Override
        public void onScroll(AbsListView view,
                            int firstVisibleItem,//当前能看到的第一个 item 的 ID(从 0 开始)
                            int visibleItemConut,//当前能看到的 item 的总数
                            int totalItemCount){//整个 ListView 的 item 总数
            //滚动的时候一直调用
            Log.d("TAG","onScroll");
        }
     }
 });

判断是否滚动到了最后一行:


//这就说明 firstVisibleItem 表示的在所有的 Item 中的 id 号
if(firstVisibleItem + visibleItemConut == totalItemCount && totalItemCount > 0){
    //滚动到最后一行的时候
}

判断滚动的方向:


if(firstVisibleItem > lastVisibleItemPosition){
    //上滑
}else if (firstVisibleItem < lastVisibleItemPosition){
    //下滑
}
lastVisibleItemPosition = firstVisibleItem;

通过一个成员变量 lastVisibleItemPosition 来记录上次第一个可视的 item 的 ID 并与当前的可视 Item 的 ID 进行比较,即可知当前滚动的方向。

当然,ListView 为我们封装好了获取当前可视的 Item 的位置等信息:


    mListView.getFirstVisiblePosition();
    mListView.getLastVisiblePosition();

ListView 常用扩展

具有弹性的 ListView

Android 默认的 ListView 在滚动到底端或者顶端的时候,并没有很好的显示。在 Android 5X 中,Google 为这样的行为添加了一个半月形的阴影效果。

在 ListView 的源码中可以发现,ListView 中有一个控制滑动到边缘的处理方法:


    protected boolean overScrollBy(int detalX, int detalY,
                        int scrollX, int scrollY,
                        int scrollRangeX, int scrollRangeY,
                        int maxOverScrollX, int maxOverScrollY,
                        boolean isTouchEvent){

    }

其中的参数 maxOverScrollY ,注释是这样解释的 umber of Pixels to overscroll by in either direction along the Y axis ,虽然这个参数的值默认值是 0 ,但只要修改这个参数的值,就可以让 ListView 具有弹性了。 我们来对这个方法进行复写:我们重新定义一个变量 mMaxOverDistance ,通过对这个变量的修改我们就达到的弹性滑动的效果。


    @Override
    protected boolean overScrollBy(int detalX, int detalY,
                        int scrollX, int scrollY,
                        int scrollRangeX, int scrollRangeY,
                        int maxOverScrollX, int maxOverScrollY,
                        boolean isTouchEvent){
            super.overScrollBy(detalX, detalY, 
                        scrollX, scrollY,
                        scrollRangeX, scrollRangeY,
                        maxOverScrollX, mMaxOverDistance,
                        isTouchEvent);
    }

为了在不同的屏幕分辨率下滑动的距离基本保持一致,我们通过计算屏幕的 density 来计算具体的值。

    private void initView(){
        DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();
        float density = metrics.density;
        mMaxOverDistance = (int) (density * mMaxOverDistance);
    }
安卓APP通过CH340实现USB串口通信与设备检测 本文详细介绍了安卓APP通过CH340芯片实现USB串口通信与设备检测的完整流程。从CH340芯片的基础原理到开发环境搭建,再到串口通信的具体实现和错误处理,提供了全面的技术指导。文章还分享了USB热插拔处理、自动重连策略以及性能优化等实战技巧,帮助开发者高效完成安卓与嵌入式设备的通信开发。 阅读详情

相关推荐

经典烧脑算法逻辑题--高楼扔鸡蛋:最少次数测出鸡蛋摔碎临界点。

如果在第2层没碎,换到第3层扔.......如果第59层没碎,换到第60层扔;有2个鸡蛋,从100层楼上往下扔,以此来测试鸡蛋的硬度。比如鸡蛋在第9层没有摔碎,在第10层摔碎了,那么鸡蛋不会摔碎的临界点就是9层。因此,我们尝试每10层扔一次,第一次从10层扔,第二次从20层扔,第三次从30层......一直扔到100层。如果第一枚鸡蛋,在50层碎了,第二枚鸡蛋,就从第1层开始扔,一层一层增长,一直扔到第49层。如果第一枚鸡蛋在50层没碎了,则继续使用二分法,在剩余楼层的一半(75层)往下扔。

借雨醉东风的博客 1818

WPF学习(二)ListView

找到工具箱双击ListBox就会在设计窗口出现一个ListBox,而且在下面的XAML的Grid中生成一段 <ListView Height="100" Width="100"> <ListView.View> <GridView> <GridViewColumn/> </...

Alina_catty的博客 1284

ROS入门(一)——ROS安装(vmware16+ubuntu20.04+ROS-Noetic)

嵌套:ROS可以在Ubuntu上运行,Ubuntu在虚拟机Vmware中安装。 从 虚拟机vmware安装→ubuntu安装→ros安装,逐步介绍安装ROS环境的过程。整个过程是我一步步跟着各种博客安装实现的,亲测可行。 版本: Vmware :Vmware Workstation16 Ubuntu :20.04 ROS :Noetic 其中vmware直接载当前最新版本就好,而ubuntu的版本要注意一下。 在ROS官网(cn - ROS Wiki),我们进入到ROS安装的步骤界面,可以看..

Netceor的博客 9741

ListView使用技巧

ListView使用技巧

黄飞的专栏 1656

【验证技能树】UVM 源码解读01 -- UVM本质上就是软件工程方法论在芯片验证领域的应用

文章摘要: UVM(通用验证方法学)是基于SystemVerilog的芯片验证框架,采用组件化、面向对象和事务级抽象设计。其核心在于职责分离与数据流,通过Driver、Monitor、Sequencer等模块协作实现高效验证。UVM强调复用性、可扩展性和可维护性,类似软件工程的模块化与低耦合原则。理解其体系结构比记忆API更重要,有助于灵活组合组件并提升验证效率。UVM不仅是工具,更融合了软件工程思维,推动验证工作向自动化、系统化发展。掌握UVM底层逻辑能优化验证环境设计,适用于从IP到SoC的多层级验证场

qq_45869788的博客 1041

告别偏色!手把手教你用i1Profiler 3.5为喷墨打印机制作专属ICC曲线(附D50/D65光源选择指南)

本文详细介绍了如何使用i1Profiler 3.5为喷墨打印机制作专属ICC曲线,解决设备偏色问题。从色彩管理基础、软件配置到色块打印与测量实战技巧,逐步指导用户完成曲线制作,并提供了D50/D65光源选择指南,确保色彩还原精准。适合摄影师和设计师提升打印质量。

weixin_30613343的博客 1万+

kotlin面试题!耗时两个礼拜,8000字安卓面试长文,看看这篇文章吧!

学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!最后如何才能让我们在面试中对答如流呢?答案当然是平时在工作或者学习中多提升自身实力的啦,那如何才能正确的学习,有方向的学习呢?有没有免费资料可以借鉴?为此我整理了一份Android学习资料路线:这里是一部分我工作以来以及参与过的大大小小的面试收集总结出来的一套BAT大厂面试资料专题包,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家。

2401_84103616的博客 635

华为2022数字芯片笔试题

单选 1、ASIC开发流程中,如下环节的先后顺序是? A. RTL-> Synthesis->P&R B. Synthesis->P&R->RTL C. Synthesis->RTL->P&R D.RTL->P&R->Synthesis 2、o10换算成十进制是多少? A. 8 B.16 C.10 D.2 3、reg [7:0] mem [1:256];initial $readmemh("me..

weixin_44072819的博客 1万+

Android mListView.getChildCount()和mAdapter.getCount()的区别

mListView.getCount()(实际上是 mAdapter.getCount()) 返回的是其 mAdapter.getCount() 返回的值。 也就是“所包含的 Item 总个数”。   mListView.getChildCount()(ViewGroup.getChildCount) 返回的是显示层面上的“所包含的子 View 个数”。 当 ListView 中

baidu_33634330的博客 796

Python爬虫实战:使用Scrapy+Playwright高效爬取全球专利数据库

本文将详细介绍如何使用Python最新技术栈(Scrapy+Playwright)构建一个高效的专利数据库爬虫系统。我们将从爬虫基础知识讲起,逐步深入到反爬应对策略、分布式爬虫架构以及数据存储方案,最终实现一个完整的专利数据采集系统。专利数据是技术创新领域的重要信息资源,包含技术描述、权利要求、申请人信息等宝贵数据。中国国家知识产权局(CNIPA)美国专利商标局(USPTO)欧洲专利局(EPO)世界知识产权组织(WIPO)

2201_76125261的博客 1384

红米k60 修复“NV损坏” 去除主板校验电阻步骤解析与图示

红米k60 基带代码:mondrian。搭载‌高通骁龙8+ Gen1处理器.国外版本称:POCO F5 Pro适用于以下型号的小米机型:23013RK75C, 23013PC75G。 💝💝💝通过博文了解 1💝💝💝-----此机型修复NV损坏硬件类操作主板图示 2💝💝💝-----了解设备出现NV损坏的底层逻辑 3💝💝💝 ------具体修改步骤

小马哥的专栏 394

判断ListView的第一个item是否完全显示

先解释几个接口的作用: ListView.getChildCount() 返回的是这个listView当前显示出来的item数量,也就是在屏幕上可以看到的数量。 ListView.getChildAt(int pos) 返回的是这个listView当前显示出来的item中的第pos项,也就是说索引是从显示出来的第一项开始计算的,如果屏幕上方有n个item看不见,那么

kyleduo 1万+

【CASS精品教程】013:CASS9.1生成标准图幅案例教程

在CASS中,可以很方便的生成标准图幅,如50*50。本文演示cass中,根据测区范围标准图幅生成过程。

智慧空间实验室 1万+

MiniGUI的mListView研究

清理硬盘时发现有几篇2011年整理的博客躺在那里,删了怪可惜的,发上来保存一下~~ 年代久远,已经过时,仅作参考用途~~~

尺树寸泓 1893

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

ListView学习实例二

该实现实现ListView的下拉刷新,代码如下: 自定义ListView: package com.example.list; import java.util.Date; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import andr

Mr_Lin 1157

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

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

Listview学习(二)

RecyclerView学习经过之前的学习,对listview的简单实用已经有所了解了。现在来学习一下RecyclerView。顾名思义,recyclerview可以回收移出界面的item,并且在需要时再次显示(具体的实现原理见http://blog.youkuaiyun.com/lylodyf/article/details/52846602)。其基本原理与Listview相似,下面先了解其用法。下面是主函数

markfavor的博客 316

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

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

C# DataGridView控件与ListView控件的对比学习(二):ListView控件学习

一、定义:     表示Windows列表视图控件,一般用来呈现数据,是一种轻量级的呈现数据的方法。 二、重要的属性:     1、第一个非常重要的属性是View:获取或设置项在控件中的显示方式,包括Details、LargeIcon、List、SmallIcon、Tile(默认为 LargeIcon)         (1)LargeIcon:每个项都显示为一个最大化图标

zs过客的小屋 9824

Android-ListView的学习(二)

1、设置ListView在第几项显示: listView.setSelection(N); N = int position 2、getConunt()与getChildCount() getCount()得到当前所有item的个数(包括未显示的)。 getChildCount()得到当前屏幕可看见显示的item.3、getChildAt(int index) 在很多时候Lis

wang2639980860的博客 376

ListView学习笔记(二)—— ConvertView

在Android的UI组件中,ListView是一个非常实用的组件。该组件主要是用于展示大批量的同类数据,比如联系人信息。 而在自定义ListView的样式时,需要重写数据接口的ListAdapter类中的getView函数,以此来定制ListView中每个item的样式。在这

sephcm的专栏 1271

学习(二)ListView的几种实现方式

写文章太累了,直接贴码吧

yybljzqz的专栏 431

flutter学习(二) listView下进行动态卡片布局

真香!本来觉得用以前的java就能做的为啥还用flutter,但是最近接触flutter之后感觉这才是写移动应用的神器啊! 尤其是用java写的listView,各种适配器传参简直了 效果 可以上下滑动,更可以显示gif动图哦 原理 在完成这个效果之前, 分两步走,listview列表和card布局 listView 没有适配器,没有viewHolder,没有entity,flutter将他变...

小松与蘑菇 2379

Android之UI学习篇十二:ListView控件学习(二)

上篇利用LIstView实现了一个简单的例子,这篇以一个更贴近项目的例子来分享一下ListView的使用方法,模拟疼痛的微信客户端list界面. 先看看实现效果: 工程结构目录: 这个案例中使用自定义的item.xml布局文件,在Activity中使用simpleAdapter和它的setViewBinder()方法来配置和绑定数据。 以下是源代码: 首先

WILLIAM-HUAN 个人技术博客 2370

Android学习笔记二十四之ListView列表视图二

Android学习笔记二十四之ListView列表视图二

Huawen的博客 1695

Android学习—ListView的使用(二)

 SimpleAdapter simpleAdapter的扩展性最好,可以定义各种各样的布局出来,可以放上ImageView(图片),还可以放上Button(按钮),CheckBox(复选框)等等。 使用SimpleAdapter 创建ListView。 程序清单1    http://schemas.android.com/apk/res/android"      

阿乾的专栏 363

Android学习笔记(二)——两个ListView联动

左右两个ListView的二级联动,实现类似外卖人软件的效果。

cheng_congcong的博客 4062
上一篇: ListView学习(一)
下一篇: ListView学习(三)
AINewBegin
博客等级 码龄12年 6粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值