仅含单个长文本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
相关产品推荐
相关产品推荐

