RecyclerView的基本用法 (五)

20 篇文章 0 订阅

这一次,我用一个极简的代码段来揭开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的理解肯定会加深不少。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值