您的位置:首页 > 其它

RecyclerView的基本用法 (五)

2016-02-12 20:27 351 查看
这一次,我用一个极简的代码段来揭开layoutmanager的神秘面纱,而这段代码也仅仅是拿出了基本骨架,而该骨架是在自定义layoutmanager必须要有的,却只有这些骨架还远远不够,看了很多类似的项目源码也发现对每个子view进行相应的layout就是必不可少的需要自己定义,代码如下:

@Override public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
int itemCount = getItemCount();
if (itemCount == 0) {
removeAllViews();
return;
}

removeAllViews();

mLastVisiblePosition = 0;
//boolean isLastLayoutedView;
int childLeft;
int childTop;
if (getChildCount() == 0) {
childLeft = childTop = 0;
}else {
final View topChild = getChildAt(0);
childLeft = getDecoratedLeft(topChild);
childTop = getDecoratedTop(topChild);
}

do {
View view = recycler.getViewForPosition(mLastVisiblePosition);
addView(view);

//isLastLayoutedView = mLayouter.isLastLaidOutView(view);
layoutDecorated(view, childLeft, childTop, 200, childTop + 100);
mLastVisiblePosition++;
childTop += 100;
} while (mLastVisiblePosition < itemCount);
}


与viewgroup一样,重点还是在layoutDecorated(view, childLeft, childTop, 200, childTop + 100);这个方法上。而该方法看看源码就知道其作用就是view.layout,唯一却别也就是decorated这个关键字,这里就不详细解释了,了解recyclerview的都知道其作用,后面会着重讲decorate在recyclerview中的地位,代码如下:

public void layoutDecorated(View child, int left, int top, int right, int bottom) {
final Rect insets = ((LayoutParams) child.getLayoutParams()).mDecorInsets;
child.layout(left + insets.left, top + insets.top, right - insets.right,
bottom - insets.bottom);
}


那么在onLayoutChildren方法里,用遍历的方式对所有子view进行layout这种方式已经不新鲜了,因为凡是实现过自定义viewgroup的人都知道,所以也就不再赘述了。而这里需要强调几点:

1 与自定义view一样,只要目标明确,实现其实并不复杂,但头疼的最多的地方就是细节,因为需要处理的细节太多了,必须要面面俱到,而这里也是最容易增长bug的地方。

2 何时attach何时detach,何时remove何时recycle,需要根据需求而定的,而这是layoutmanager的职责所在,所以这些需要自己定义。

3 这一点纯属个人意见,在我看来,自定义layoutmanager的使用场景其实并不多,因为多数的需求完全可以用其他的简便方式所代替,甚至是其他方式来做会更好。而它的专属领域在于,子view数量不定且有列表性质,如果用自定义view来做,那就需要做一套view的回收机制倒不是说不可以详情在github上twowayview里有,但本着不重复造轮子的原则不如自定义layoutmanager;而很多时候一些需求又完全可以通过viewtype或者放到单个子view里去处理等等方式来实现,所以这时肯定是放到单个子view中去处理会更好。但特殊情况特殊处理。

以上就是自定义layoutmanager的所有我个人的理解,可商榷的地方肯定会不少,但最主要的还是对这几个开源项目的深入研究,很多地方会有很多坑,比如PreLayout。就算没有机会用到,但对recyclerview的理解肯定会加深不少。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: