写点什么

没想到位图算法在 Android RecyclerView 中还可以这样应用!

用户头像
Android架构
关注
发布于: 1 小时前


位图表示法。假设每个 bit 所在 position 值为 1,表示 position。例如,第 2 位的 bit 为 1,表示值为 2。那么[0,2,4,5,7]可以表示如下:



8 个 bit 就可以表示原本需要 160 个 bit 的 5 个数字。是不是非常节省空间呢?


使用 bit 以及位置来表示数字,叫做位图算法,它的优点是:


  1. 节省空间

  2. 快速排序

  3. 快速查询


2.2 位操作




  1. 赋值操作 mData |= 1 << index

  2. 清除操作 mData &= ~(1 << index)

  3. 查询操作 (mData & (1 << index)) != 0

2.2.1 赋值操作

2.2.2 清除操作

2.2.2 查询操作



3. 位图算法在 Android 中的实现


=============================================================================


3.1 ChildHelper.java




RecyclerView 的构造函数,会调用 initChildrenHelper()。


//RecyclerView.java


private void initChildrenHelper() {


mChildHelper = new ChildHelper(new ChildHelper.Callback() {


//...省略代码


});


}


ChildHelper 主要的功能是“逻辑隐藏”RecyclerView 上的子 View。当 View 做消失动画的时候,会调用 RecyclerView#addAnimatingView(ViewHolder viewHolder) -> mChildHelper.addView(view, true)


//ChildHelper.java


void addView(View child, boolean hidden) {


addView(child, -1, hidden);


}


void addView(View child, int index, boolean hidden) {


final int offset;


if (index < 0) {


offset = mCallback.getChildCount();


} else {


offset = getOffset(index);


}


mBucket.insert(offset, hidden);


if (hidden) {


hideViewInternal(child);


}


mCallback.addView(child, offset);


if (DEBUG) {


Log.d(TAG, "addViewAt " +


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


index + ",h:" + hidden + ", " + this);


}


}


注意到**「mBucket.insert(offset, hidden);」** Bucket 类就是位图算法在 RecyclerView ChildHelper 类中的实现。



3.2 getChildCount()




RecyclerView 有 getChildCount()方法,LayoutManager 也有 getChildCount()方法,它们有什么区别呢?


RecyclerView 继承于 ViewGroup


//ViewGroup.java


public int getChildCount() {


return mChildrenCount;


}

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
没想到位图算法在Android RecyclerView中还可以这样应用!