Android ListView初始化将实例化多少个item
2016-06-29 17:56
369 查看
下面是分析ListView初始化的源码流程分析。
在AbsListView.onLayout中会调用layoutChildren(),由listview实现
ListView.layoutChildren:
ListView.fillFromTop:
ListView.fillDown:
在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; }
相关文章推荐
- 收藏Android学习过程中的精华博客
- (OK)(OK) seem-tools-auto_create_vm_android.sh
- Android——文件操作
- OpenCV初探:二、Android程序示例
- Android-ObservableScrollView(二)
- android开发教程(三)——环境搭建之android-sdk
- 【Android】自定义控件-颜色选择器/取色器
- Android 日期和时间选择器
- android开发教程(一)——目录
- Android studio配置ndk和输出hello world
- android 打包吃出现Android - Expected Resource of type ID错误
- Intent对象详解
- Android为文本框设置背景资源-shape
- Android.mk 文件语法详解
- Android Launcher浅析(三)
- (OK) run my script at boot time in android-x86_64 (Chih-Wei Huang)
- Android之五大布局
- 高仿QQ下拉刷新之LoadView
- Android textview边框绘制
- Android动画