没想到位图算法在 Android RecyclerView 中还可以这样应用!
位图表示法。假设每个 bit 所在 position 值为 1,表示 position。例如,第 2 位的 bit 为 1,表示值为 2。那么[0,2,4,5,7]可以表示如下:
8 个 bit 就可以表示原本需要 160 个 bit 的 5 个数字。是不是非常节省空间呢?
使用 bit 以及位置来表示数字,叫做位图算法,它的优点是:
节省空间
快速排序
快速查询
赋值操作 mData |= 1 << index
清除操作 mData &= ~(1 << index)
查询操作 (mData & (1 << index)) != 0
2.2.1 赋值操作
2.2.2 清除操作
2.2.2 查询操作
=============================================================================
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 " +
index + ",h:" + hidden + ", " + this);
}
}
注意到**「mBucket.insert(offset, hidden);」** Bucket 类就是位图算法在 RecyclerView ChildHelper 类中的实现。
RecyclerView 有 getChildCount()方法,LayoutManager 也有 getChildCount()方法,它们有什么区别呢?
RecyclerView 继承于 ViewGroup
//ViewGroup.java
public int getChildCount() {
return mChildrenCount;
}
评论