Android竖直RecyclerView实现可展开文档树无法横向滚动问题求解
问题分析
当前无法触发横向滚动的核心原因有2个:
HorizontalScrollView设置了fillViewport="true"属性,该属性会强制内部子控件(也就是你的RecyclerView)宽度占满HorizontalScrollView的可视宽度,就算列表内容实际宽度更宽也不会被撑开,自然没有横向滚动的空间。- 你没有为不同层级的树节点设置左侧缩进,所有列表项都左对齐的情况下,item的最大宽度不会超过屏幕宽度,也无法触发横向滚动。
修复步骤
1. 修改activity布局
移除HorizontalScrollView的fillViewport="true"属性,修改后代码如下:
<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".TreeActivity"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/list" android:layout_width="wrap_content" android:layout_height="match_parent" /> </HorizontalScrollView>
2. 适配树节点的缩进逻辑
在适配器的bindView方法中,根据节点的嵌套层级设置列表项的左侧边距,不同层级的节点向右缩进,撑开RecyclerView的总宽度,修改参考代码如下:
override fun bindView(p0: BranchViewHolder?, p1: Int, p2: TreeNode<*>?) { Log.i(TAG, "bindView: ${p2?.isExpand}") val rotateDegree = if (p2?.isExpand == true) -90 else 0 p0?.branchBinding?.arrow?.rotation = rotateDegree.toFloat() with(p2?.content as Branch) { p0?.branchBinding?.title?.text = this.name // 按节点层级设置左侧缩进,每一层缩进30dp,可根据需求调整数值 val nodeLevel = p2.level // 需确保你的TreeNode类已维护level属性,根节点level为0,子节点level=父节点level+1 val density = p0?.itemView?.resources?.displayMetrics?.density ?: 1f val paddingLeft = (nodeLevel * 30 * density).toInt() p0?.itemView?.setPadding(paddingLeft, 0, 0, 0) p0?.itemView?.layoutParams= RecyclerView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT) } }
3. 确认节点层级属性
检查你自定义的TreeNode类是否正确维护了每个节点的level属性:根节点层级为0,每向下嵌套一层层级加1即可。
修改完成后,展开多层节点时列表总宽度超过屏幕宽度就会自动触发横向滚动,同时RecyclerView保持原有竖直滚动逻辑,符合需求。
内容的提问来源于stack exchange,提问作者Abdullah Z Khan
相关产品推荐
相关产品推荐

