Android Adapter机制 源码笔记(7): AbsListView(3)

  1. AbsListView的setAdapter函数其实没有替换和保存新的Adapter, 也没有触发UI重绘等,只是简单的将mCheckStates/mCheckedIdStates清空, 是重点子类override函数, AbslListView中关于Item**check和select的处理逻辑还是很多的,但是这一块逻辑反而平时开发基本不会涉及(很少有需求对这些功能进行高度定制的)**

  2. setOnScrollListener(OnScrollListener l): 除了将给的listener设置以外,还会触发一次invokeOnItemScrollListener(), 后者会触发mFastScroller/mOnScrollListener的onScroll函数: 并且还会调用一次onScrollChanged(0, 0, 0, 0)(dummy values, View’s implementation does not use these)

  3. 解释一下SmoothScrollbar这个概念:

    • 如果开启了这个特性:那么scrollBar的thumb(滑块)的位置和尺寸都是基于当前可视的ItemView的像素值(pixel), 这个特性假设所有的itemView都有相同的height, 如果不能满足这个情况,会导致scrollBar在滑动时发生不应该的形变(一会儿长一会儿短), 这种情况应该关闭这个feature.
    • 如果这个特性被关掉,那么thumb的位置和尺寸都仅仅取决于当前爱Adapter中item的总数和当前可见的itemView在data set中的pos, 这样就不会因为itemView的不同height造成活动中的尺寸畸变.
  4. int computeVerticalScrollExtent(): 继承自View, 计算scroll时显示的滑块(thumb)的垂直尺寸:
    * 在没有childView时, 为 0.
    * 如果有childView,但是没有开启mSmoothScrollbarEnabled, 那么就是 1.
    * 如果有childView并且开启了mSmoothScrollbarEnabled, 会根据child的count/height以及View的bottom等信息综得到一个合适的值.

  5. int computeVerticalScrollOffset(): 同样继承自View, 计算的是ScrollBar的thumb的在滑道(track)中的垂直偏移,其实就是thumb的垂直坐标.

    • 如果没有childVIew或者mFirstPosition是无效pos,那么返回0.
    • 否则:
      • 如果mSmoothScrollbarEnabled: 像之前说的一样,基于Item的pixel级尺寸进行计算.
      • 如果没有mSmoothScrollbarEnabled: 像之前说的一样,基于Item的总数和当前可视的item在data set中的pos决定.
  6. int computeVerticalScrollRange(): 继承自View, 这个是计算滑道的长度. 同样的会有对SmoothScrollbarEnabled的分别处理. (这三个计算滑道与滑块的函数返回的值应该基于同一标尺)

  7. getTopFadingEdgeStrength/getBottomFadingEdgeStrength: 继承自View, Returns the strength, or intensity, of the top faded edge.

  8. onMeasure(int widthMeasureSpec, int heightMeasureSpec): 感觉其实没干啥实质性的工作…

  9. void onLayout(boolean changed, int l, int t, int r, int b): 一个关键点是mInLayout开始设为true/结束时设为false, 如果changed, 那么会在当前的childView上调用forceLayout, 并将RecyclerBin里的Child也都标记为dirty(mRecycler.markChildrenDirty(), 前面分析过,其实也是调用forceLayout).如果发现ItemCount变化或者DataChanged, 那么会尝试回调FastScroller的onItemCountChanged(mItemCount), 最后调用layoutChildren(空函数,交由子类实现).

  10. boolean setFrame(int left, int top, int right, int bottom): 继承自View,这个函数是在layout的时候被调用, 最终制定View的尺寸和位置,是一个非常重要的函数. 这里只是顺带在super.setFrame(…)返回表示change时会重新设一下mPopup的位置.

  11. updateScrollIndicators(): 根据当前情况设置mScrollUp/mScrollDown(如果有的话)的可见性,代表这可以向上/下scroll. 其判断逻辑还是挺简单的(不过很有参考价值):

    • 如果第一个/最后一个Item当前没有显示(使用mFirstPosition和childCount判断),那么显然是可以向上/下scroll的.
    • 还有就是第一个/最后一个Item的上沿/下沿在AbsListView的mTop/mBottom的上/下(就是纯坐标判断了,还会考虑到padding, 如果Item的top小于padding,那么说明上沿没有显示, 同样,如果Item的Bottom已经超过了parentView的高度-padding,那么说明下沿没有显示),那么可以认为还是可以向上/下scroll的.
  12. obtainView(int position, boolean[] isScrap): 该函数会返回一个已经绑定了数据的View, 在发现View已经不可能从recycle bin中直接重用,这时候就只能convert一个old view或者new 一个新的View.

    • isScrap: 如果返回的view是重用自scrap heap, 那么这个数组的第一个成员是true.
    • 先尝试从RecycleBin保存的TransientStateView取View(position作为参数),
    • 如果没有取到, 那么从RecycleBin的scrapView中取一个(前面解析过这个函数,会尽量返回一个以前也在同样position的View,否则就返回最后一个)
    • 如果前面的步骤取到了View,那么会将此View作为conv
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值