如图,顶部有轮播图,tab需要吸顶,不同tab对应的条目不同,各tab下的条目存在不同类型,需要支持下拉刷新与上拉加载。天资愚笨,花了一周时间终于实现,特此记录。
项目中刷新加载控件采用SmartRefreshLayout,这次仍然打算采用它,不知道是否冲突。
【tab切换】毫无疑问采用TabLayout+ViewPager实现,难点是【吸顶】,因为自己没有实现过。
google关键词:【android 吸顶+切换】,淘到了这篇简文,算是有一点眉目,感激作者的分享。
run了Demo并整合了SmartRefreshLayout,谢天谢地,没有冲突。
Demo中的一个干货是OuterRecyclerView和InnerRecyclerView两个类。主要解决了RecyclerView嵌套后,纵向滑动的冲突。前者负责是否进行事件拦截,后者负责是否消费事件及将结果通知给前者。这两个类的部分命名表意性不强,注释不足,且引入tab后点击事件不灵敏了,我进行了改进,代码见文末。
Demo中的另一个干货是让我知道了阿里vLayout的存在,承认平时太懒了,作为程序员不关注技术时事及大厂动态的我有点失败。还好,【吸顶】采用vLayout实现了。但也走了一些弯路,参见了示例的我最后发现要在实例化StickyLayoutHelper之后为其设置颜色helper.setBgColor(0xffffffff)
才符合产品效果图。
ViewPager的每一个Item都是一个Fragment(with InnerRecyclerView),发现InnerRecyclerView无法滑动导致列表只能展示一部分。以为是SmartRefreshLayout的干扰,以为是OuterRecyclerView和InnerRecyclerView的实现有问题,但最终发现是ViewPager的高度出现了问题。
于是就根据不同的数据源(由于Tab不同)中item的数量及Item的布局高度计算出ViewPager的高度,并在合适的时候(ViewPager的pageChange监听中)改变ViewPager的Height,这需要维护的东西太多了,太low了,而且ViewPager的高度最终是计算出来的最大值。
百度关键字:【ViewPager Fragment 高度】会发现,各种让自定义ViewPager并重写onMeasure方法。有遍历child找到其中最大高度的、有使用getChildView(0)使用其高度的、有使用getCurrentItem()高度的,看的眼花缭乱。
OuterRecyclerView的Item中layout_height="wrap_content"的ViewPager显示根本不出来(空白),layout_height="match_parent"的ViewPager也只是显示一部分(即InnerRecyclerView的列表无法滑动)
但最终找到了老外