android UI 优化之 AbsListView之深度优化

android 数字选择器中文字颜色透明度渐变的实现 首先看android View源码中渐变的实现 draw方法 boolean horizontalEdges = (viewFlags & FADING_EDGE_HORIZONTAL) != 0; boolean verticalEdges = (viewFlags & FADING_EDGE_VERTICAL) != 0; 这个需要调用setVerticalFadingE 阅读详情
android提供的很多List控件如 listview、gridview默认都会显示一个fadingedge的东西,它在View的top和bottom处各显示一个渐变半透的阴影以达到更好的视觉效果,但是这个带来的副作用就是导致在性能不是那么强劲的机器上,一些listview,gridview的拖动会显得很不流畅,因为我们知道绘制带Alpha的图片是最耗时的。 
 
我们的优化思路就是对这个fadingedge做一些修改,当view处于滚动状态时,通过接口setVerticalFadingEdgeEnabled(false)让其不显示fadingedge,当view处于静止状态时,通过接口setVerticalFadingEdgeEnabled(true)恢复显示fadingedge。以上的listview和gridview等控件都是继承与AbsListView,所以我们直接修改framework中的AbsListView.java文件,就可以达到系统级的改动效果了。 
 
具体修改如下: 
    @Override 
    publicboolean onTouchEvent(MotionEvent ev) { 
        if(!isEnabled()) { 
            //A disabled view that is clickable still consumes thetouch 
            //events, it just doesn't respond to them. 
            returnisClickable() || isLongClickable(); 
        } 
        if(mFastScroller != null) { 
            booleanintercepted =mFastScroller.onTouchEvent(ev); 
            if(intercepted) { 
                returntrue; 
            } 
        } 
        finalint action = ev.getAction(); 
        Viewv; 
        intdeltaY; 
        if(mVelocityTracker == null) { 
            mVelocityTracker= VelocityTracker.obtain(); 
        } 
        mVelocityTracker.addMovement(ev); 
        switch(action & MotionEvent.ACTION_MASK){ 
        caseMotionEvent.ACTION_DOWN: { 
            setVerticalFadingEdgeEnabled(false); 
            mActivePointerId= ev.getPointerId(0); 
            finalint x = (int) ev.getX(); 
            finalint y = (int) ev.getY(); 
            intmotionPosition = pointToPosition(x, y); 
            if(!mDataChanged) { 
                if((mTouchMode != TOUCH_MODE_FLING)&& (motionPosition>= 0) 
                        &&(getAdapter().isEnabled(motionPosition))) { 
                    //User clicked on an actual view (and was not stopping a fling). Itmight be a 
                    //click or a scroll. Assume it is a click until provenotherwise 
                    mTouchMode= TOUCH_MODE_DOWN; 
                    //FIXME Debounce 
                    if(mPendingCheckForTap == null) { 
                        mPendingCheckForTap= new CheckForTap(); 
                    } 
                    postDelayed(mPendingCheckForTap,ViewConfiguration.getTapTimeout()); 
                }else { 
                    if(ev.getEdgeFlags() != 0 &&motionPosition < 0) { 
                        //If we couldn't find a view to click on, but the down event wastouching 
                        //the edge, we will bail out and try again. This allows the edgecorrecting 
                        //code in ViewRoot to try to find a nearby view toselect 
                        returnfalse; 
                    } 
                    if(mTouchMode == TOUCH_MODE_FLING) { 
                        //Stopped a fling. It is a scroll. 
                        createScrollingCache(); 
                        mTouchMode= TOUCH_MODE_SCROLL; 
                        mMotionCorrection= 0; 
                        motionPosition= findMotionRow(y); 
                        reportScrollStateChange(OnScrollListener.SCROLL_STATE_TOUCH_SCROLL); 
                    } 
                } 
            } 
            if(motionPosition >= 0) { 
                //Remember where the motion event started 
                v= getChildAt(motionPosition -mFirstPosition); 
                mMotionViewOriginalTop= v.getTop(); 
            } 
            mMotionX= x; 
            mMotionY= y; 
            mMotionPosition= motionPosition; 
            mLastY= Integer.MIN_VALUE; 
            break; 
        } 
        caseMotionEvent.ACTION_MOVE: { 
            finalint pointerIndex =ev.findPointerIndex(mActivePointerId); 
            finalint y = (int) ev.getY(pointerIndex); 
            deltaY= y - mMotionY; 
            switch(mTouchMode) { 
            caseTOUCH_MODE_DOWN: 
            caseTOUCH_MODE_TAP: 
            caseTOUCH_MODE_DONE_WAITING: 
                //Check if we have moved far enough that it looks more likea 
                //scroll than a tap 
                startScrollIfNeeded(deltaY); 
                break; 
            caseTOUCH_MODE_SCROLL: 
                if(PROFILE_SCROLLING) { 
                    if(!mScrollProfilingStarted) { 
                        Debug.startMethodTracing("AbsListViewScroll"); 
                        mScrollProfilingStarted= true; 
                    } 
                } 
                if(y != mLastY) { 
                    deltaY-= mMotionCorrection; 
                    intincrementalDeltaY = mLastY != Integer.MIN_VALUE ? y - mLastY :deltaY; 
                     
                    //No need to do all this work if we're not going to moveanyway 
                    booleanatEdge = false; 
                    if(incrementalDeltaY != 0) { 
                        atEdge= trackMotionScroll(deltaY,incrementalDeltaY); 
                    } 
                    //Check to see if we have bumped into the scrolllimit 
                    if(atEdge && getChildCount()> 0) { 
                        //Treat this like we're starting a new scroll from thecurrent 
                        //position. This will let the user start scrolling backinto 
                        //content immediately rather than needing to scroll back tothe 
                        //point where they hit the limit first. 
                        intmotionPosition = findMotionRow(y); 
                        if(motionPosition >= 0) { 
                            finalView motionView = getChildAt(motionPosition -mFirstPosition); 
                            mMotionViewOriginalTop= motionView.getTop(); 
                        } 
                        mMotionY= y; 
                        mMotionPosition= motionPosition; 
                        invalidate(); 
                    } 
                    mLastY= y; 
                } 
                break; 
            } 
            break; 
        } 
        caseMotionEvent.ACTION_UP: { 
            switch(mTouchMode) { 
            caseTOUCH_MODE_DOWN: 
            caseTOUCH_MODE_TAP: 
            caseTOUCH_MODE_DONE_WAITING: 
                setVerticalFadingEdgeEnabled(true); 
                finalint motionPosition = mMotionPosition; 
                finalView child = getChildAt(motionPosition -mFirstPosition); 
                if(child != null &&!child.hasFocusable()) { 
                    if(mTouchMode != TOUCH_MODE_DOWN) { 
                        child.setPressed(false); 
                    } 
                    if(mPerformClick == null) { 
                        mPerformClick= new PerformClick(); 
                    } 
                    finalAbsListView.PerformClick performClick =mPerformClick; 
                    performClick.mChild= child; 
                    performClick.mClickMotionPosition= motionPosition; 
                    performClick.rememberWindowAttachCount(); 
                    mResurrectToPosition= motionPosition; 
                    if(mTouchMode == TOUCH_MODE_DOWN || mTouchMode == TOUCH_MODE_TAP){ 
                        finalHandler handler = getHandler(); 
                        if(handler != null) { 
                            handler.removeCallbacks(mTouchMode== TOUCH_MODE_DOWN ? 
                                    mPendingCheckForTap: mPendingCheckForLongPress); 
                        } 
                        mLayoutMode= LAYOUT_NORMAL; 
                        if(!mDataChanged &&mAdapter.isEnabled(motionPosition)) { 
                            mTouchMode= TOUCH_MODE_TAP; 
                            setSelectedPositionInt(mMotionPosition); 
                            layoutChildren(); 
                            child.setPressed(true); 
                            positionSelector(child); 
                            setPressed(true); 
                            if(mSelector != null) { 
                                Drawabled = mSelector.getCurrent(); 
                                if(d != null && d instanceofTransitionDrawable) { 
                                    ((TransitionDrawable)d).resetTransition(); 
                                } 
                            } 
                            postDelayed(newRunnable() { 
                                publicvoid run() { 
                                    child.setPressed(false); 
                                    setPressed(false); 
                                    if(!mDataChanged) { 
                                        post(performClick); 
                                    } 
                                    mTouchMode= TOUCH_MODE_REST; 
                                } 
                            },ViewConfiguration.getPressedStateDuration()); 
                        }else { 
                            mTouchMode= TOUCH_MODE_REST; 
                        } 
                        returntrue; 
                    }else if (!mDataChanged &&mAdapter.isEnabled(motionPosition)) { 
                        post(performClick); 
                    } 
                } 
                mTouchMode= TOUCH_MODE_REST; 
                break; 
            caseTOUCH_MODE_SCROLL: 
                finalint childCount = getChildCount(); 
                if(childCount > 0) { 
                    if(mFirstPosition == 0 &&getChildAt(0).getTop() >= mListPadding.top&& 
                            mFirstPosition+ childCount < mItemCount&& 
                            getChildAt(childCount- 1).getBottom() <= 
                                    getHeight()- mListPadding.bottom) { 
                        mTouchMode= TOUCH_MODE_REST; 
                        reportScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); 
                        setVerticalFadingEdgeEnabled(true); 
                    }else { 
                        finalVelocityTracker velocityTracker =mVelocityTracker; 
                        velocityTracker.computeCurrentVelocity(1000,mMaximumVelocity); 
                        finalint initialVelocity = (int)velocityTracker.getYVelocity(mActivePointerId); 
     
                        if(Math.abs(initialVelocity) > mMinimumVelocity){ 
                            if(mFlingRunnable == null) { 
                                mFlingRunnable= new FlingRunnable(); 
                            } 
                            reportScrollStateChange(OnScrollListener.SCROLL_STATE_FLING); 
                             
                            mFlingRunnable.start(-initialVelocity); 
                        }else { 
                            mTouchMode= TOUCH_MODE_REST; 
                            reportScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); 
                            setVerticalFadingEdgeEnabled(true); 
                        } 
                    } 
                }else { 
                    mTouchMode= TOUCH_MODE_REST; 
                    reportScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); 
                    setVerticalFadingEdgeEnabled(true); 
                } 
                break; 
            } 
            setPressed(false); 
            //Need to redraw since we probably aren't drawing the selectoranymore 
            invalidate(); 
            finalHandler handler = getHandler(); 
            if(handler != null) { 
                handler.removeCallbacks(mPendingCheckForLongPress); 
            } 
            if(mVelocityTracker != null) { 
                mVelocityTracker.recycle(); 
                mVelocityTracker= null; 
            } 
             
            mActivePointerId= INVALID_POINTER; 
            if(PROFILE_SCROLLING) { 
                if(mScrollProfilingStarted) { 
                    Debug.stopMethodTracing(); 
                    mScrollProfilingStarted= false; 
                } 
            } 
            break; 
        } 
        caseMotionEvent.ACTION_CANCEL: { 
            mTouchMode= TOUCH_MODE_REST; 
            setPressed(false); 
            ViewmotionView = this.getChildAt(mMotionPosition -mFirstPosition); 
            if(motionView != null) { 
                motionView.setPressed(false); 
            } 
            clearScrollingCache(); 
            finalHandler handler = getHandler(); 
            if(handler != null) { 
                handler.removeCallbacks(mPendingCheckForLongPress); 
            } 
            if(mVelocityTracker != null) { 
                mVelocityTracker.recycle(); 
                mVelocityTracker= null; 
            } 
             
            mActivePointerId= INVALID_POINTER; 
            break; 
        } 
         
        caseMotionEvent.ACTION_POINTER_UP: { 
            onSecondaryPointerUp(ev); 
            finalint x = mMotionX; 
            finalint y = mMotionY; 
            finalint motionPosition = pointToPosition(x, y); 
            if(motionPosition >= 0) { 
                //Remember where the motion event started 
                v= getChildAt(motionPosition -mFirstPosition); 
                mMotionViewOriginalTop= v.getTop(); 
                mMotionPosition= motionPosition; 
            } 
            mLastY= y; 
            break; 
        } 
        } 
        returntrue; 
    } 
======================================================================== 
    privateclass FlingRunnable implements Runnable { 
         
        privatefinal Scroller mScroller; 
         
        privateint mLastFlingY; 
        FlingRunnable(){ 
            mScroller= new Scroller(getContext()); 
        } 
        voidstart(int initialVelocity) { 
            intinitialY = initialVelocity < 0 ? Integer.MAX_VALUE :0; 
            mLastFlingY= initialY; 
            mScroller.fling(0,initialY, 0, initialVelocity, 
                    0,Integer.MAX_VALUE, 0, Integer.MAX_VALUE); 
            mTouchMode= TOUCH_MODE_FLING; 
            post(this); 
            if(PROFILE_FLINGING) { 
                if(!mFlingProfilingStarted) { 
                    Debug.startMethodTracing("AbsListViewFling"); 
                    mFlingProfilingStarted= true; 
                } 
            } 
        } 
        voidstartScroll(int distance, int duration) { 
            intinitialY = distance < 0 ? Integer.MAX_VALUE :0; 
            mLastFlingY= initialY; 
            mScroller.startScroll(0,initialY, 0, distance, duration); 
            mTouchMode= TOUCH_MODE_FLING; 
            post(this); 
        } 
        privatevoid endFling() { 
            mTouchMode= TOUCH_MODE_REST; 
            reportScrollStateChange(OnScrollListener.SCROLL_STATE_IDLE); 
            clearScrollingCache(); 
            removeCallbacks(this); 
            if(mPositionScroller != null) { 
                removeCallbacks(mPositionScroller); 
            } 
        } 
        publicvoid run() { 
            switch(mTouchMode) { 
            default: 
                return; 
                 
            caseTOUCH_MODE_FLING: { 
                if(mItemCount == 0 || getChildCount() == 0) { 
                    endFling(); 
                    return; 
                } 
                finalScroller scroller = mScroller; 
                booleanmore = scroller.computeScrollOffset(); 
                finalint y = scroller.getCurrY(); 
                //Flip sign to convert finger direction to list itemsdirection 
                //(e.g. finger moving down means list is moving towards thetop) 
                intdelta = mLastFlingY - y; 
                //Pretend that each frame of a fling scroll is a touchscroll 
                if(delta > 0) { 
                    //List is moving towards the top. Use first view asmMotionPosition 
                    mMotionPosition= mFirstPosition; 
                    finalView firstView = getChildAt(0); 
                    mMotionViewOriginalTop= firstView.getTop(); 
                    //Don't fling more than 1 screen 
                    delta= Math.min(getHeight() - mPaddingBottom - mPaddingTop - 1,delta); 
                }else { 
                    //List is moving towards the bottom. Use last view asmMotionPosition 
                    intoffsetToLast = getChildCount() - 1; 
                    mMotionPosition= mFirstPosition + offsetToLast; 
                    finalView lastView = getChildAt(offsetToLast); 
                    mMotionViewOriginalTop= lastView.getTop(); 
                    //Don't fling more than 1 screen 
                    delta= Math.max(-(getHeight() - mPaddingBottom - mPaddingTop - 1),delta); 
                } 
                finalboolean atEnd = trackMotionScroll(delta,delta); 
                if(more && !atEnd){ 
                    invalidate(); 
                    mLastFlingY= y; 
                    post(this); 
                }else { 
                    endFling(); 
                    AbsListView.this.setVerticalFadingEdgeEnabled(true); 
                    if(PROFILE_FLINGING) { 
                        if(mFlingProfilingStarted) { 
                            Debug.stopMethodTracing(); 
                            mFlingProfilingStarted= false; 
                        } 
                    } 
                } 
                break; 
            } 
            } 
        } 
    } 
 

修改后重新编译,在性能稍差的机器上运行,滚动一下listview或者gridview,你就可以看到比较明显的效果了!


原文:http://blog.sina.com.cn/s/blog_4a6c59d60100pjqc.html

Grok-1.5+Ollama企业级本地化部署与合规实践指南 本文详细介绍了Grok-1.5+Ollama企业级本地化部署与合规实践指南,重点分析了本地化部署的成本优势和数据主权保障。通过RTX 4090显卡的硬件选型、Ubuntu 22.04系统优化及部署流程中的关键陷阱规避,为企业提供了高效、安全的AI模型部署方案。特别适合金融、医疗等敏感行业。 阅读详情

相关推荐

基于STM32的智能火灾报警系统设计:多传感器融合与远程控制实现

本文详细介绍基于STM32单片机的智能火灾报警系统设计,采用多传感器融合技术(烟雾、温度、火焰检测)实现高精度火灾识别。系统集成远程控制与手机APP监控,通过加权决策算法降低误报率,提供多级响应策略,确保火灾预警的准确性与可靠性。

u5v6w7的博客 1102

手写Custom Adapter:ListView在2024年高性能实践指南

ListView作为Android原生滚动容器,其核心价值在于极简渲染路径、低内存占用与确定性性能表现。它并非过时技术,而是面向固定结构、高敏感场景(如医保结算、政务审批)的轻量级视图映射方案。Custom Adapter通过ViewHolder模式消除findViewById开销、数据契约解耦绑定逻辑、生命周期感知规避BadTokenException,显著提升列表响应速度与稳定性。相比ArrayAdapter的全量刷新陷阱,自定义实现支持精准通知(notifyItemChanged)、复用路径优化及业务

weixin_30555515的博客 420

科研党必备:5分钟搞定MATLAB闪退问题(含R2020a-R2023b各版本适配)

本文针对科研人员常见的MATLAB闪退问题,提供了从R2020a到R2023b各版本的适配解决方案。通过分析六大诱因和版本定制化修复方法,帮助用户快速诊断和解决闪退问题,包括内存优化、高级调试和预防性维护等实用技巧,确保科研计算的连续性和稳定性。

t1u2v的博客 1958

Android requiresFadingEdge和fadingEdgeLength属性渐变实现

1、最近有一个需求,需要对ListView和recyclerView是否应淡化边缘; 2、在开发中遇到问题发现fadingEdge=“vertical”,fadingEdgeLength="150dp"不生效,于是各种尝试,最终需要增加fadingEdgeLength=“150dp”,requiresFadingEdge="vertical"就可生效; 3、下面我们来看code: 1)先看一下xm...

yuanjl 6443

我爬取了某非法网贷后台系统数据,终于知道什么叫做利滚利滚利滚利了

我爬取了非法贷款的后台网站!

weixin_44042821的博客 2880

中兴问天 BE7200MAX SFP 光口用华为猫棒替代光猫完整配置教程

PPPoE 账号密码:若原光猫为 Route 模式,在宽带设置页可见用户名,密码需按 F12 打开浏览器开发者模式,点击密码输入框,查看代码中 “value=” 后的内容即为明文密码。若仍失败,核对 PON 类型是否与运营商网络匹配。PON 认证信息:LOID(逻辑 ID,部分地区含密码)、设备 SN 码(标签或设备信息页)、PON 类型(GPON/EPON,运营商网络类型)。电脑保持与路由器连接,访问路由器管理地址(默认通常为 192.168.5.1,可参考路由器说明书),登录后台。

Gulper_Eel的博客 3335

Android AbsListView坐标体系解析

 Android AbsListView坐标体系解析 Android的AbsListView与Android ListView不同,AbsListView代表了一个抽象的列表View。在实际的开发中直接使用Android ListView几乎可以完全完成所有与List这类View相关的开发任务,但在极个别情况下, 需要深入到Android的AbsListView中进行仔细的坐标定位。 为

Zhang Phil 5723

海康威视工业相机网络配置实战:从MVS软件操作到IP地址规划

本文详细介绍了海康威视工业相机的网络配置实战,从MVS软件操作到IP地址规划。重点讲解了IP设置的重要性、Windows系统下的网络配置步骤、避免IP冲突的技巧,以及MVS软件中的相机IP配置方法。帮助用户快速掌握工业相机的网络连接技术,确保稳定高效的图像采集。

weixin_30296405的博客 485

Android自定义View缓冲,android : 自定义无上下缓冲色的ScrollView 类名称:NoFadingScrollView...

public class NoFadingScrollView extends ScrollView {// private static final int MAX_Y_OVERSCROLL_DISTANCE =65;// private int mMaxYOverscrollDistance;private ScrollViewInterface scrollViewInterface;pub...

weixin_35097989的博客 226

windows版kafka异常java.nio.file.FileSystemException另一个程序正在使用此文件,进程无法访问

环境 现象 原因 解决方法 参考

山水牧羊 3847

固定资产报废的损失鉴定怎么做?

在社会生产的日常中,企业经常会遇到固定资产报废的损失鉴定,那么怎么去做鉴定?哪些情况下能申请固定资产报废损失鉴定呢? 今天,华碧鉴定就和大家说一说固定资产报废损失鉴定那些事儿。 符合下列条件之一的固定资产可申请报废: 1、使用年限过长,功能丧失,完全失去使用价值,或不能使用并无修复价值的; 2、产品技术落后,质量差,耗能高,效率低,已属淘汰且不适于继续使用,或技术指标已达不到使用要求的; 3、严重损坏,无法修复的或虽能修复,但累计修理费已接近或超过市场价值的; 4、主要附件损坏,无.

weixin_50362670的博客 2116

Android BaseAdapter详解:原理、优化与实战应用

适配器是Android开发中连接数据与UI的核心组件,BaseAdapter作为基础抽象类提供了高度灵活的视图复用机制。其核心原理通过getView()方法实现数据绑定,配合ViewHolder模式显著提升列表性能。在电商商品列表、聊天界面等复杂场景中,多类型布局和异步加载技术能有效解决内存管理问题。随着View Binding和Data Binding等现代技术的引入,BaseAdapter开发模式正变得更加高效。掌握视图复用、内存优化等关键技巧,能够帮助开发者构建流畅的列表界面,特别是在处理大规模数据展

chupu2979的博客 354

输入文件(Example-1.inp)参数解读与获取方法

弹性参数:优先使用默认值(泊松比 0.25、杨氏模量 8×10⁵ bars),或参考区域地质 / 地球物理研究。断层参数:从地震矩反演、GPS 位移反演、地质图 / 震源机制获取(核心参数,需确保准确性)。网格 / 图形参数:根据研究区范围和输出需求调整(步长 / 放大系数等)。

2301_79258000的博客 81

Android 中文 API(123) —— AbsListView(一)

前言   本章内容是android.widget.AbsListView,版本为Android 2.3 r1,翻译来自"cnmahj",欢迎大家访问他的博客:http://android.toolib.net/blog/,再次感谢"cnmahj"!欢迎你一起参与Android的中文翻译,联系我over140@gmail.com。     声明   欢迎转载,但请保留文章原始出处:)...

weixin_33692284的博客 262

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

android widget 布局,Android Widget Attributes——View

最近因为想着重新把这个插件捡起来,把view的属性慢慢的全部补上,所以顺便了解一下各个属性,在这里列举View的属性,含义,以及代码设置。简书Markdown编辑器实在是渣,只能把表格换成下面这种形式android:idvoid setId(int);设置id,单个布局中保持唯一。可以用View.generateViewId()来生成。android:accessibilityLiveRegion...

weixin_30843121的博客 1314

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Android TV listView焦点平滑移动

智能电视 listView 焦点 平滑移动

欢迎关注公众号:【码农突围】,公号后台回复9999,可以获取一份500页的LeetCode刷题笔记。 5515

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

三、Listview优化和常用设置

listview 是Android开发中最熟悉的控件了,经过2年的工作和学习,熟悉和积累了几种优化的方式; 1:在getView中编写带有缓存的代码 @Override public View getView(final int position, View convertView, ViewGroup parent) { ViewHolder holder;

niu0147的专栏 567

AbsListView小结

1.滚动时,无论时FlingMode还是ScrollMode,最终都是调用trackMotionScroll(),其中包括了View回收的计算及执行,trackMotionScroll()使用了offsetChildrenTopAndBottom()对children做坐标变换。 2.ScrollMode时,主要调用scrollIfNeeded(int x, int y, MotionEvent...

淡淡的宁静的博客 1027

Android开发——ListView的复用机制源码解析

0.前言前段时间找工作,看了很多人的面经,不得不说找个工作很麻烦。尤其是Android,岗位的数量比不上前端后Java后台也就算了,问的东西又多又杂,这里就不多列举了,其中有一个印象比较深的问题是关于ListView复用机制的。复用机制谁都会用,但是却不一定能真正讲清楚。因此才有了此文。1. ListView的继承关系和Adapter的由来ListView直接继承自的AbsListVi...

关于Android开发的一些技术点总结 ╮( ̄▽ ̄”)╭ 2331

Android--ListView作用详解

1.ListView   ListView列表视图控件是Android中常用的控件之一,其直接继承了AbsListView,是一个以垂直方式在项目中显示View视图的列表。ListView的数据项,来自一个继承了ListAdapter接口的适配器。   ListView的常用属性一般就是用来设置列表的间隔、分割线、表头、表尾等属性的,常用属性有以下几个,并且Android也为其提供了对应的se...

streate的专栏 5705

Android WebView 相关问题解决

WebView快速滑动时,屏幕出现黑线问题: 在WebView页面快速上下滑动时,屏幕上方或下方出现一条黑线,解决: webView.setVerticalFadingEdgeEnabled(false); WebView 发送POST请求: webView.postUrl(url, postDataStr.getBytes());//postDataStr为post请求体,...

sinat_22910799的博客 402

Android ListView工作原理完全解析,带你从源码的角度彻底理解

在Android所有常用的原生控件当中,用法最复杂的应该就是ListView了,它专门用于处理那种内容元素很多,手机屏幕无法展示出所有内容的情况。ListView可以使用列表的形式来展示内容,超出屏幕部分的内容只需要通过手指滑动就可以移动到屏幕内了。 另外ListView还有一个非常神奇的功能,我相信大家应该都体验过,即使在ListView中加载非常非常多的数据,比如达到成百上千条甚至更多,ListView都不会发生OOM或者崩溃,而且随着我们手指滑动来浏览更多数据时,程序所占用的内存竟然都不会跟着增长。那

郭霖的专栏 15万+

AbsListView 浅析

Base class that can be used to implement virtualized lists of items. A list does  not have a spatial definition here. For instance, subclases of this class can display the content of the list in a g

编程生活 6703

scrollView上下滚item淡入淡出效果

scrollView上下滚item淡入淡出效果直接设置scrollView.setVerticalFadingEdgeEnabled(true); scrollView.setFadingEdgeLength(xxxx);即可达到两个端淡入淡出效果,listView也可以,注意这两个方法为View的方法。

FIRE_TRAY的Android之路 2354
上一篇: Activity, Service,Task, Process and Thread之间的关系
下一篇: Android高手进阶教程(二十七)之---基于ViewFlipper实现的自定义新手指引控件.
SpeedyCoder
博客等级 码龄14年 415粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值