Android ListView初始化简单分析



    下面是分析ListView初始化的源码流程分析,主要是ListVIew.onLayout过程与普通视图的layout过程完全不同,避免流程交代不清楚,以下是一个流程的思维导图。

     思维导图是顺序是从左向右,从上向下。




一、 先看构造函数,上图中1.1就不分析了,主要是读取一些ListView参数,直接来看1.2 ViewGroup构造函数源码

    private void initViewGroup() {
        ......
        // 初始化保存当前ViewGroup中所有View的数组
        mChildren = new View[ARRAY_INITIAL_CAPACITY];
        // 初始时其Child个数为0
        mChildrenCount = 0;
        ......
    }



视图的创建过程的都会执行的三个步骤: onMeasure, onLayout, onDraw


二、接着2 即 ListView.onMeasure方法,只是获取当前ListView的宽高

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // Sets up mListPadding
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        // 获取当前ListView总宽高
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);

        ......

        setMeasuredDimension(widthSize , heightSize);
        mWidthMeasureSpec = widthMeasureSpec;        
    }

三、步骤3是重点,AbsListView.onLayout的流程与普通View的不同

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        mInLayout = true;
        // 初始时changed = true
        if (changed) {
            int childCount = getChildCount();
            for (int i = 0; i < childCount; i++) {
            	// ?
                getChildAt(i).forceLayout();
            }
            mRecycler.markChildrenDirty();
        }
        
        if (mFastScroller != null && mItemCount != mOldItemCount) {
            mFastScroller.onItemCountChanged(mOldItemCount, mItemCount);
        }

        // ListView实现此方法
        layoutChildren();
        mInLayout = false;

        mOverscrollMax = (b - t) / OVERSCROLL_LIMIT_DIVISOR;
    }

四、步骤4.1 具体分析ListVIew.layoutChildren

    @Override
    protected void layoutChildren() {
    	// 默认为false
        final boolean blockLayoutRequests = mBlockLayoutRequests;
        if (!bl
  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值