Android中内嵌GridView的ScrollView如何调整高度实现连续滚动
Android中如何调整ScrollView高度

你现有布局存在几个影响效果的问题:
- ScrollView在ConstraintLayout中设置
layout_height="wrap_content",无法占满scrollView2下方的剩余可用空间,内容过多时还会超出屏幕可视范围 - ScrollView内部的LinearLayout设置
layout_width="wrap_content",会导致GridView的auto_fit列数计算异常,无法正确适配屏幕宽度 - GridView本身自带滚动特性,和ScrollView嵌套会产生滚动冲突,默认只会显示单行内容
- GridView的约束布局属性在LinearLayout父容器中完全不生效,属于无效配置
方案1:修改布局+自定义无滚动GridView(兼容性最好)
第一步:调整布局XML
<!-- ScrollView高度设为0dp,增加底部约束占满剩余空间 --> <ScrollView android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintTop_toBottomOf="@+id/scrollView2" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" android:paddingStart="20dp" android:paddingEnd="20dp" android:paddingTop="10dp" android:fillViewport="true" android:scrollbars="none" > <!-- LinearLayout宽度改为match_parent --> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <!-- 删掉GridView无效的约束属性,宽度改为match_parent,替换为自定义无滚动GridView --> <com.yourpackage.NoScrollGridView android:id="@+id/gridView_thumbnail" android:layout_width="match_parent" android:layout_height="wrap_content" android:horizontalSpacing="10dp" android:numColumns="auto_fit" android:scrollbars="none" android:verticalSpacing="10dp" /> </LinearLayout> </ScrollView>
第二步:添加自定义NoScrollGridView类
public class NoScrollGridView extends GridView { public NoScrollGridView(Context context) { super(context); } public NoScrollGridView(Context context, AttributeSet attrs) { super(context, attrs); } public NoScrollGridView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // 重写测量逻辑,让GridView高度等于所有item总高度,不产生独立滚动 int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } }
方案2:用NestedScrollView替代(无需自定义View,适配Android 5.0+)
把布局中的ScrollView换成androidx.core.widget.NestedScrollView,然后在业务代码中给GridView设置禁用嵌套滚动即可:
// Kotlin 代码 gridView_thumbnail.isNestedScrollingEnabled = false
// Java 代码 gridView_thumbnail.setNestedScrollingEnabled(false);
内容的提问来源于stack exchange,提问作者박길현
相关产品推荐
相关产品推荐

