zoukankan      html  css  js  c++  java
  • Android ListView初始化将实例化多少个item

    下面是分析ListView初始化的源码流程分析。

    在AbsListView.onLayout中会调用layoutChildren(),由listview实现

    @Override
        protected void onLayout(boolean changed, int l, int t, int r, int b) {
            super.onLayout(changed, l, t, r, b);
    
            mInLayout = true;
    
            final int childCount = getChildCount();
            if (changed) {
                for (int i = 0; i < childCount; i++) {
                    getChildAt(i).forceLayout();
                }
                mRecycler.markChildrenDirty();
            }
        
            // 由子类实现
            layoutChildren();
            mInLayout = false;
    
            mOverscrollMax = (b - t) / OVERSCROLL_LIMIT_DIVISOR;
    
            // TODO: Move somewhere sane. This doesn't belong in onLayout().
            if (mFastScroll != null) {
                mFastScroll.onItemCountChanged(getChildCount(), mItemCount);
            }
        }

    ListView.layoutChildren:

    @Override
        protected void layoutChildren() {
            final boolean blockLayoutRequests = mBlockLayoutRequests;
            if (blockLayoutRequests) {
                return;
            }
    
            mBlockLayoutRequests = true;
    
            try {
                super.layoutChildren();
    
                invalidate();
    
                if (mAdapter == null) {
                    resetList();
                    invokeOnItemScrollListener();
                    return;
                }
    
                final int childrenTop = mListPadding.top;
                final int childrenBottom = mBottom - mTop - mListPadding.bottom;
                final int childCount = getChildCount();
    
    ……
    ……
    
    default:
                    if (childCount == 0) {
                        if (!mStackFromBottom) {
                            final int position = lookForSelectablePosition(0, true);
                            setSelectedPositionInt(position);
                           // 初始化将执行这里
                            sel = fillFromTop(childrenTop);
                        } else {
                            final int position = lookForSelectablePosition(mItemCount - 1, false);
                            setSelectedPositionInt(position);
                            sel = fillUp(mItemCount - 1, childrenBottom);
                        }
                    } else {
                        if (mSelectedPosition >= 0 && mSelectedPosition < mItemCount) {
                            sel = fillSpecific(mSelectedPosition,
                                    oldSel == null ? childrenTop : oldSel.getTop());
                        } else if (mFirstPosition < mItemCount) {
                            sel = fillSpecific(mFirstPosition,
                                    oldFirst == null ? childrenTop : oldFirst.getTop());
                        } else {
                            sel = fillSpecific(0, childrenTop);
                        }
                    }
                    break;
                }

    ListView.fillFromTop:

     private View fillFromTop(int nextTop) {
            mFirstPosition = Math.min(mFirstPosition, mSelectedPosition);
            mFirstPosition = Math.min(mFirstPosition, mItemCount - 1);
            if (mFirstPosition < 0) {
                mFirstPosition = 0;
            }
            return fillDown(mFirstPosition, nextTop);
        }

    ListView.fillDown:

    private View fillDown(int pos, int nextTop) {
            View selectedView = null;
    
         // listview的高度
    int end = (mBottom - mTop); if ((mGroupFlags & CLIP_TO_PADDING_MASK) == CLIP_TO_PADDING_MASK) { end -= mListPadding.bottom; } // 初始化时pos = 0,如果item总数少于一屏幕,执行 mItemCount - pos次 // 如果item多余一屏幕,执行end - nextTop次 while (nextTop < end && pos < mItemCount) { // is this the selected item? boolean selected = pos == mSelectedPosition; View child = makeAndAddView(pos, nextTop, true, mListPadding.left, selected); nextTop = child.getBottom() + mDividerHeight; if (selected) { selectedView = child; } pos++; } setVisibleRangeHint(mFirstPosition, mFirstPosition + getChildCount() - 1); return selectedView; }
  • 相关阅读:
    视频质量评测标准——VMAF
    净化网络环境!可信数字内容版权服务解决方案发布
    如何用sysbench做好IO性能测试
    云栖专辑|阿里开发者们的第二个感悟:PG大V德哥的使命感与开放心态
    CRI 与 ShimV2:一种 Kubernetes 集成容器运行时的新思路
    阿里巴巴持续投入,etcd 正式加入 CNCF
    阿里系统软件迎战“双11”超高流量峰值全纪录
    从SQL Server CloudDBA 看云数据库智能化
    ls -l 权限后面有个点
    Error File: /admin/app/template.app.php at 285 line.
  • 原文地址:https://www.cnblogs.com/chenlong-50954265/p/5627775.html
Copyright © 2011-2022 走看看