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

仅含单个长文本Item的ListView滚动控制底部菜单显隐问题咨询

适配方案

核心思路

原来的逻辑仅通过首个可见item的位置判断滚动方向,当只有1个item时该值恒为0导致逻辑失效,需要补充单item场景下的滚动偏移判断逻辑,两个场景的判断相互兼容即可覆盖所有情况。

具体实现代码

var mLastFirstVisibleItem = 0
// 新增变量:记录第一个可见item的顶部偏移
var mLastItemTop = 0

listView.setOnScrollListener(object : AbsListView.OnScrollListener {
    override fun onScroll(
        view: AbsListView?,
        firstVisibleItem: Int,
        visibleItemCount: Int,
        totalItemCount: Int
    ) {
        // 仅当只有1个item时走该逻辑
        if (totalItemCount == 1 && visibleItemCount > 0) {
            val firstItem = view?.getChildAt(0) ?: return
            val currentItemTop = firstItem.top
            // 滚动偏移阈值,避免微小滑动触发误判,可自行调整大小
            val scrollThreshold = 10
            if (mLastItemTop - currentItemTop > scrollThreshold) {
                // 向上滚动,隐藏底部菜单
                menuView.visibility = View.INVISIBLE
                Log.i("a", "scrolling up...")
            } else if (currentItemTop - mLastItemTop > scrollThreshold) {
                // 向下滚动,显示底部菜单
                menuView.visibility = View.VISIBLE
                Log.i("a", "scrolling down...")
            }
            mLastItemTop = currentItemTop
        }
    }

    override fun onScrollStateChanged(view: AbsListView, scrollState: Int) {
        val totalItemCount = view.adapter?.count ?: 0
        // 多于1个item时走原有逻辑
        if (totalItemCount > 1) {
            val currentFirstVisibleItem = view.firstVisiblePosition
            if (currentFirstVisibleItem > mLastFirstVisibleItem) {
                this.menuView.visibility = View.INVISIBLE
                Log.i("a", "scrolling down...")
            } else if (currentFirstVisibleItem < mLastFirstVisibleItem) {
                this.menuView.visibility = View.VISIBLE
                Log.i("a", "scrolling up...")
            }
            mLastFirstVisibleItem = currentFirstVisibleItem
        }
    }
})

特殊场景补充

如果你说的"item内的TextView可滚动"是指TextView本身设置了滚动属性,不是ListView滚动,需要额外给TextView添加滚动监听:

textView.setOnScrollChangeListener { _, _, scrollY, _, oldScrollY ->
    val scrollThreshold = 10
    if (scrollY - oldScrollY > scrollThreshold) {
        // 文本向上滚动,隐藏菜单
        menuView.visibility = View.INVISIBLE
    } else if (oldScrollY - scrollY > scrollThreshold) {
        // 文本向下滚动,显示菜单
        menuView.visibility = View.VISIBLE
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 05:36:05