ListView显示原理概述

这篇博客详细介绍了Android中ListView的显示原理,包括如何在布局阶段将子视图加入ListView,不触发requestLayout的attachViewToParent方法,以及ListView如何在不重新测量的情况下确定子视图的尺寸和位置。还探讨了ListView的滑动机制,通过offsetChildrenTopAndBottom实现平滑滚动,以及如何处理滑出视线的子视图。此外,文章解释了使用offsetChildrenTopAndBottom相对于mScrollX/Y的优势。
摘要由CSDN通过智能技术生成

1.ListView如何和何时把child加入到自身中

在布局阶段使用AbsListView#onLayout()->ListView#layoutChildren()->RecycleBin#fillActiveViews(),ListView#fillFromTop(int nextTop)->ListView#fillDown(int pos, int nextTop)->makeAndAddView(int position, int y, boolean flow, int childrenLeft,
        boolean selected)->setupChild(View child, int position, int y, boolean flowDown, int childrenLeft,
        boolean selected, boolean recycled)

setupChild中不是我们通常使用addView的方法加入child,而是使用ViewGroup#attachViewToParent(View child, int index, LayoutParams params),这种方法和addView很大的区别是不会去触发requestLayout,而只是触发invalidate,就是说不会每添加一个child都重新测量。

ListView使用attachViewToParent添加child时不触发requestLayout,那么怎么确定child的width/height,left,top,right,bottom。把child  attachViewToParent后ListView会在setupchild中为child准备MeasureSpec,然后调用child.measure()。测量完确定了width/height后,就确定child的left,top,right,bottom调用child.layout(),其实在调用setu

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值