You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 如何实现多个TextView同时同步横向滚动?

ListView多TextView同步横向滚动实现方案

核心实现逻辑

通过监听单个TextView的滚动事件,实时同步其余两个TextView的水平滚动偏移量即可,实现成本很低,不需要自定义控件:

  • 首先给三个TextView都开启横向滚动支持
  • 给每个TextView绑定滚动监听器,滚动时同步其余两个的scrollX值
  • 加状态标记位避免滚动事件循环触发

具体实现步骤

  1. 布局中给TextView配置基础属性
<TextView
    android:id="@+id/tv1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:singleLine="true"
    android:scrollHorizontally="true" />
<!-- 另外两个TextView配置一致,分别设id为tv2、tv3 -->
  1. 在ListView的Adapter的getView方法中绑定同步逻辑
// 每个item内声明标记位,避免滚动循环触发
AtomicBoolean isSyncing = new AtomicBoolean(false);

TextView tv1 = convertView.findViewById(R.id.tv1);
TextView tv2 = convertView.findViewById(R.id.tv2);
TextView tv3 = convertView.findViewById(R.id.tv3);

// 统一设置滚动支持
tv1.setMovementMethod(new ScrollingMovementMethod());
tv2.setMovementMethod(new ScrollingMovementMethod());
tv3.setMovementMethod(new ScrollingMovementMethod());

// 统一滚动监听器
View.OnScrollChangeListener scrollListener = (v, scrollX, scrollY, oldScrollX, oldScrollY) -> {
    if (isSyncing.get()) return;
    isSyncing.set(true);
    // 同步其余两个TextView的滚动偏移
    if (v != tv1) tv1.scrollTo(scrollX, scrollY);
    if (v != tv2) tv2.scrollTo(scrollX, scrollY);
    if (v != tv3) tv3.scrollTo(scrollX, scrollY);
    isSyncing.set(false);
};

// 绑定监听器
tv1.setOnScrollChangeListener(scrollListener);
tv2.setOnScrollChangeListener(scrollListener);
tv3.setOnScrollChangeListener(scrollListener);

兼容低版本方案

如果需要兼容API 23以下的系统,可以用ViewTreeObserver.OnScrollChangedListener替代OnScrollChangeListener,逻辑完全一致,只需要把监听的注册方式改成对应的ViewTreeObserver API即可。

内容的提问来源于stack exchange,提问作者idrkwhatsgoingon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 13:36:06