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; }
  • 相关阅读:
    随便说说辞职后
    用Excel的VBA实现文本匹配与替换
    [转]为什么你做不到呢?
    [转]女生,你为什么不沉住气奋斗?
    写在互联网分析的前面
    回归白领的生活
    NSSortDescriptor:对NSDictionary的NSArray进行排序
    本团队推荐:大神开发的仿原神风格ue5开发MMOARPG核心战斗系统
    UE4外包团队:UE4开发元宇宙项目 UE5开发元宇宙或最佳?
    元宇宙外包团队:Unity开发元宇宙应用,在元宇宙里里Unity扮演什么角色?
  • 原文地址:https://www.cnblogs.com/chenlong-50954265/p/5627775.html
Copyright © 2011-2022 走看看