【Android】掌握自定义LayoutManager(二) 实现流式布局

本文详细讲解如何自定义RecyclerView的LayoutManager以实现流式布局,包括生成默认LayoutParams、onLayoutChildren方法的实现,以及如何处理滑动事件。在实现过程中,作者强调了在布局时考虑滑动方向的重要性,并探讨了逆序布局子View的两种方案。
摘要由CSDN通过智能技术生成

这不最近再研究自定义LayoutManager么,想来想去也没有好的创意,就先拿它开第一刀吧。

(后话:流式布局Item宽度不一,不知不觉给自己挖了个大坑,造成拓展一些功能难度倍增,观之网上的DEMO,99%Item的大小都是一样的,so,这个系列的下一篇我计划 实现一个Item大小一样 的酷炫LayoutManager。但是最终做成啥样的效果还没想好,有朋友看到酷炫的效果可以告诉我,我去高仿一个。)

自定义LayoutManager的步骤:


以本文的流式布局为例,需求是一个垂直滚动的布局,子View以流式排列。先总结一下步骤:

一 实现 generateDefaultLayoutParams()

二 实现 onLayoutChildren()

三 竖直滚动需要 重写canScrollVertically()和scrollVerticallyBy()

下面我们就一步一步来吧。

二 实现generateDefaultLayoutParams()

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

如果没有特殊需求,大部分情况下,我们只需要如下重写该方法即可。

@Override

public RecyclerView.LayoutParams generateDefaultLayoutParams() {

return new RecyclerView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);

}

RecyclerView.LayoutParams是继承自android.view.ViewGroup.MarginLayoutParams的,所以可以方便的使用各种margin。

这个方法最终会在recycler.getViewForPosition(i)时调用到,在该方法浩长源码的最下方:

final ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();

final LayoutParams rvLayoutParams;

if (lp == null) {

//这里会调用mLayout.generateDefaultLayoutParams()为每个ItemView设置LayoutParams

rvLayoutParams = (LayoutParams) generateDefaultLayoutParams();

holder.itemView.setLayoutParams(rvLayoutParams);

} else if (!checkLayoutParams(lp)) {

rvLayoutParams = (LayoutParams) generateLayoutParams(lp);

holder.itemView.setLayoutParams(rvLayoutParams);

} else {

rvLayoutParams = (LayoutParams) lp;

}

rvLayoutParams.mViewHolder = holder;

rvLayoutParams.mPendingInvalidate = fromScrap && bound;

return holder.itemView;

重写完这个方法就能编译通过了,只不过然并卵,界面上是一片空白,下面我们就走进onLayoutChildren()方法 ,为界面添加Item。

注:99%用不到的情况:如果需要存储一些额外的东西在LayoutParams里,这里返回你自定义的LayoutParams即可。

当然,你自定义的LayoutParams需要继承自RecyclerView.LayoutParams

三 onLayoutChildren()

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

该方法是LayoutManager的入口。它会在如下情况下被调用:

1 在RecyclerView初始化时,会被调用两次

2 在调用adapter.notifyDataSetChanged()时,会被调用。

3 在调用setAdapter替换Adapter时,会被调用。

4 在RecyclerView执行动画时,它也会被调用。

即RecyclerView 初始化数据源改变时 都会被调用。

(关于初始化时为什么会被调用两次,我在系列第一篇文章里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值