最近实现了一个需求,觉得还挺有意思的,所以在这里记录下。
需求:tab+content(列表),上半部分显示tab数据,可以通过点击tab切换不同的content,下半部分显示content数据(列表),可以左右滑动切换不同tab的内容。如下图所示:
图1.png实现方式,大家的第一反应就是RecyclerView+ViewPager(Fragment+RecyclerView)的方式,我也是这么想的。
不过有两个细节特殊处理的:
1.点击tab切换,需要定位到content的第一条数据;
2.当前content往前翻页,需要定位到上一个content的最后一条数据,当前content往后翻页,需要定位到下一个content的第一条数据;
第1个细节比较好处理,无非就是在点击tab的时候,将Fragment下的RecyclerView定位到0;
第2个细节如图所示,当前处于tab2,往前翻页到tab1,其Fragment下的RecyclerView定位到最后一条数据tab1_3,如果是往后翻页到tab3,则定位到第一条数据tab3_1。(看起来是不是跟RecyclerView有点像)
Tips:RecyclerView是有记忆功能的,在Fragment没有被销毁的情况下,切换恢复Fragment看到的还是之前的position,所以这里要处理position问题。
图2.png处理方式
监听ViewPager的滑动事件,在onPageSelected中对前后的Fragment进行处理,提前对position进行处理可以避免RecyclerView跳动。
override fun onPageSelected(position: Int) {
resourceVpAdapter.fragmentList.get(position - 1)?.scrollToLast()//自定义函数,获取Adapter下对应的Fragment,定位到最后一条数据
resourceVpAdapter.fragmentList.get(position + 1)?.scrollToFirst()//自定义函数,获取Adapter下对应的Fragment,定位到第一条数据
}
Tips:onPageSelected在setCurrentItem以及vp滑动翻页都会被调用。
为什么不用RecyclerView实现呢
因为如果content的数据是分页加载的,那么就不好处理数据加载问题。
以上分析有不对的地方,请指出,互相学习,谢谢哦!
网友评论