原文链接:https://mp.weixin.qq.com/s/L3o2i3WTmg1ScXEYDS8YCg

在上一篇文章 [Android 实现锚点定位
](https://mp.weixin.qq.com/s/EY...,我们介绍了tablayout+scrollView实现的锚点定位,今天我们使用tablayout+recyclerView 来实现同样的效果。
效果图:

实现思路

实现的思路与上一篇文章是一致的:
1、监听recyclerView滑动到的位置,tablayout切换到对应标签
2、tablayout各标签点击,recyclerView可滑动到对应区域

数据模拟

数据模拟,使用上一文章的AnchorView作为recyclerView的每个字view,同时这里对recyclerView的最后一个子view的高度进行修改,让其充满屏幕。

private LinearLayoutManager manager;
private String[] tabTxt = {"客厅", "卧室", "餐厅", "书房", "阳台", "儿童房"};
//判读是否是recyclerView主动引起的滑动,true- 是,false- 否,由tablayout引起的
private boolean isRecyclerScroll;
//记录上一次位置,防止在同一内容块里滑动 重复定位到tablayout
private int lastPos;
//用于recyclerView滑动到指定的位置
private boolean canScroll;
private int scrollToPosition;//tablayout设置标签
for (int i = 0; i < tabTxt.length; i++) {tabLayout.addTab(tabLayout.newTab().setText(tabTxt[i]));
}//计算内容块所在的高度,全屏高度-状态栏高度-tablayout的高度(这里固定高度50dp),用于recyclerView的最后一个item view填充高度
int screenH = getScreenHeight();
int statusBarH = getStatusBarHeight(this);
int tabH = 50 * 3;
int lastH = screenH - statusBarH - tabH;
manager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(manager);
recyclerView.setAdapter(new MyAdapter(this, tabTxt, lastH));@Override
public void onBindViewHolder(MyViewHolder holder, int position) {holder.anchorView.setContentTxt(tabTxt[position]);holder.anchorView.setAnchorTxt(tabTxt[position]);//判断最后一个viewif (position == tabTxt.length - 1) {if (holder.anchorView.getHeight() < lastH) {LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);params.height = lastH;holder.anchorView.setLayoutParams(params);}}
}

recyclerView滑动定位

recyclerView滑动引起的,addOnScrollListeneronScrolled的监听第一个可见view的位置,直接将tablayout定位到相应的位置。

recyclerView.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {//当滑动由recyclerView触发时,isRecyclerScroll 置trueif (event.getAction() == MotionEvent.ACTION_DOWN) {isRecyclerScroll = true;}return false;}
});recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {@Overridepublic void onScrolled(RecyclerView recyclerView, int dx, int dy) {super.onScrolled(recyclerView, dx, dy);if (isRecyclerScroll) {//第一个可见的view的位置,即tablayou需定位的位置int position = manager.findFirstVisibleItemPosition();if (lastPos != position) {tabLayout.setScrollPosition(position, 0, true);}lastPos = position;}}
});

tablayout切换定位

点击tablayout进行切换,recyclerView需要滑动到相应的位置,注意这里需要根据跳转位置不同,进行相应的滑动。

tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {@Overridepublic void onTabSelected(TabLayout.Tab tab) {//点击标签,使recyclerView滑动,isRecyclerScroll置falseint pos = tab.getPosition();isRecyclerScroll = false;moveToPosition(manager, recyclerView, pos);}@Overridepublic void onTabUnselected(TabLayout.Tab tab) {}@Overridepublic void onTabReselected(TabLayout.Tab tab) {}
});public void moveToPosition(LinearLayoutManager manager, RecyclerView mRecyclerView, int position) {// 第一个可见的view的位置int firstItem = manager.findFirstVisibleItemPosition();// 最后一个可见的view的位置int lastItem = manager.findLastVisibleItemPosition();if (position <= firstItem) {// 如果跳转位置firstItem 之前(滑出屏幕的情况),就smoothScrollToPosition可以直接跳转,mRecyclerView.smoothScrollToPosition(position);} else if (position <= lastItem) {// 跳转位置在firstItem 之后,lastItem 之间(显示在当前屏幕),smoothScrollBy来滑动到指定位置int top = mRecyclerView.getChildAt(position - firstItem).getTop();mRecyclerView.smoothScrollBy(0, top);} else {// 如果要跳转的位置在lastItem 之后,则先调用smoothScrollToPosition将要跳转的位置滚动到可见位置// 再通过onScrollStateChanged控制再次调用当前moveToPosition方法,执行上一个判断中的方法mRecyclerView.smoothScrollToPosition(position);scrollToPosition = position;canScroll = true;}
}recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {@Overridepublic void onScrollStateChanged(RecyclerView recyclerView, int newState) {super.onScrollStateChanged(recyclerView, newState);if (canScroll) {canScroll = false;moveToPosition(manager, recyclerView, scrollToPosition);}}
});

至此,两种实现锚点定位的方法就介绍到这里,希望能帮助到读者在实际项目中的使用。
代码与上一篇文章的在同一个git地址里。

详细代码见
github地址:https://github.com/taixiang/tabScroll

欢迎关注我的博客:https://blog.manjiexiang.cn/
更多精彩欢迎关注微信号:春风十里不如认识你

有个「佛系码农圈」,欢迎大家加入畅聊,开心就好!

过期了,可加我微信 tx467220125 拉你入群。

Android tabLayout+recyclerView实现锚点定位相关推荐

  1. Android 实现锚点定位

    相信做前端的都做过页面锚点定位的功能,通过<a href="#head"> 去设置页面内锚点定位跳转. 本篇文章就使用tablayout.scrollview来实现an ...

  2. html增加锚点,html增加锚点定位

    第一种方法,也是最简单的方法是锚点用标签,在href属性中写入DIV的id.如下: div { height: 800px; width: 400px; border: 2px solid black ...

  3. Android TabLayout和ViewPager

    In this tutorial we'll be implementing a ViewPager under the TabLayout that we'd already implemented ...

  4. scrollIntoView()实现简单的锚点定位

    综述 锚点定位是一个再熟悉不过的操作了,通常会用a标签href=#XX去实现,不过这样做,有一个问题,就是页面会有刷新感,而且地址栏会有变化,F5刷新,则#XXX还是显示在地址栏里,这样如果要进一步进 ...

  5. android列表实现置顶,Android利用RecyclerView实现全选、置顶和拖拽功能示例

    Android利用RecyclerView实现全选.置顶和拖拽功能示例 发布时间:2020-08-23 16:26:42 来源:脚本之家 阅读:159 作者:爱开发 前言 今天给大家分享是如何在Rec ...

  6. 微信小程序-锚点定位+内容滑动控制导航选中

    之前两篇文章分别介绍了锚点定位和滑动内容影响导航选中,这里我们就结合起来,实现这两个功能! 思路不再多说,直接上干货! WXML <view class="navigateBox&qu ...

  7. html 标签、图像、链接、注释、锚点定位、特殊字符

    常用的 html 标签 <!-- 1.成对出现的标签:--><h1>h1标题</h1> <div>这是一个div标签</div> <p ...

  8. 如何用html语言定位img,html经常使用标签(图像标签img,连接标签a,锚点定位,及路径)...

    1 图像标签img (重点) 单词缩写: image 图像html HTML网页中任何元素的实现都要依靠HTML标签,要想在网页中显示图像就须要使用图像标签,接下来将详细介绍图像标签以及和他相关的属性 ...

  9. Android中RecyclerView嵌套RecyclerView或嵌套ListView

    Android中RecyclerView嵌套RecyclerView或嵌套ListView

最新文章

  1. python3中map函数_解决Python3下map函数的显示问题
  2. 自动局部变量 与 静态局部变量 的区别与用途
  3. MyBatis和hibernate本质区别与应用场景
  4. 双指针 - 四数之和
  5. Andriod 学习笔记 layout布局
  6. mongodb地理空间索引原理阅读摘要
  7. CreateFile系类异步、并行(同一个串口发送接收)
  8. 透明怎么弄_玻璃球里的花纹是怎么弄进去的?谜终于解开了!
  9. 2018厦门大学计算机技术分数线,厦大录取分数线2018 各省最新录取情况
  10. 内置模块之configparser
  11. 前端之JQuery:JQuery文档操作
  12. Windows FindFirstFile利用
  13. 什么是 SNMP 和 MIB
  14. Axure9学习笔记1:介绍及安装
  15. Python 好玩代码
  16. 计算机鼠标知识,计算机基础知识:鼠标的使用
  17. 实施持续绩效管理流程的 6 大实用技巧
  18. codelite 设置
  19. html添加markdown,为自己的网站添加Markdown——showdown.js使用教程
  20. [SHELL]: ln 命令详解

热门文章

  1. wsdd文件是怎么生成的_Axis WSDD文件参考文档
  2. 【openfst样例1】Tokenization
  3. 2. 离散特征处理方法--特征交叉 feature crosses
  4. kafka项目启动_Kafka 探险 源码环境搭建
  5. matlab 将图片立体化,MATLAB基础(五)——绘制立体图
  6. python unit test 访问开发代码,使用Python的unittest模块作为testrunner时,如何在测试前运行初始化代码?...
  7. [Java工程师面试精选]Redis cluster集群模式的原理
  8. SpringBoot如何使用策略模式干掉if else
  9. 使用EF框架实现MVC的增删改查功能!!!Entity Framework
  10. 阿里p8呕心沥血整理出来的,APP UI自动化测试思路总结,速看