如何使TextView跟随RecyclerView指定项滚动 支持超出项宽的长文本展示
可行实现方案
有两种成熟的实现方案可以满足需求:
方案1:标题内嵌到子项布局(实现成本最低)
- 改造单个子项的根布局为垂直方向的
LinearLayout或者FrameLayout,在子项内容的上方预留标题展示区域 - 仅你指定需要展示标题的对应位置子项,把标题TextView设为
VISIBLE,其余位置子项的标题统一设为GONE - 要支持标题超出子项宽度展示,需要给RecyclerView以及它的直接父布局都加上
android:clipChildren="false"、android:clipToPadding="false"属性,关闭默认的内容裁剪限制 - 该方案天然支持滚动同步,因为标题本身就是子项的一部分,不需要额外写滚动监听逻辑
注意点:如果多个相邻子项都需要显示标题,可通过调整子项顶部间距避免标题重叠;如果出现后渲染的子项遮挡前一个子项标题的问题,可给标题设置更高的
elevation,或者自定义RecyclerView的getChildDrawingOrder调整绘制优先级,让需要展示标题的子项后绘制。
方案2:外层叠加悬浮标题(灵活度最高)
- 布局层把RecyclerView和独立的标题TextView放在同一个
FrameLayout下,标题TextView放在RecyclerView的上层 - 给RecyclerView添加
OnScrollListener滚动监听,每次滚动触发时:- 调用
layoutManager.findViewByPosition(targetPosition)拿到目标子项的View实例 - 计算目标子项当前的水平偏移量,再同步更新标题TextView的X坐标:
titleTv.setX(recyclerView.getLeft() + targetView.getLeft())
- 调用
- 标题直接设置
layout_width="wrap_content"即可,只要父布局没有裁剪限制,就可以正常展示超出子项宽度的文本内容
注意点:如果目标子项被滑出屏幕外,
findViewByPosition会返回null,可在此时主动把标题设为GONE避免异常展示。
内容的提问来源于stack exchange,提问作者Wei-Cheng David
相关产品推荐
相关产品推荐

