CollapsingToolbar嵌套ViewPager后,NestedScrollView内ListView无法完全显示求助
解决CollapsingToolbar+ViewPager下NestedScrollView中ListView无法撑满的问题
嘿,我之前也碰到过一模一样的坑!咱们一步步拆解问题,搞定它:
首先核心矛盾是ListView和NestedScrollView的嵌套冲突——ListView自带滚动特性,NestedScrollView会默认让它只计算单个列表项的高度,自然就缩成一行了。另外还要配合好AppBarLayout的滚动配置,不然布局联动也会出问题。
方案一:换成RecyclerView(最推荐)
ListView属于比较老旧的控件了,RecyclerView不仅灵活,还能完美适配NestedScrollView的嵌套场景:
- 把布局里的
<ListView>直接替换成<androidx.recyclerview.widget.RecyclerView> - 给RecyclerView加属性
android:nestedScrollingEnabled="false",让滚动事件交给NestedScrollView处理 - 保持RecyclerView的布局参数为
match_parent,它会自动填充NestedScrollView的可用空间
方案二:自定义ListView强制计算总高度(必须用ListView时)
如果项目限制不能换控件,就自定义一个ListView,让它测量所有子项的总高度:
public class FullHeightListView extends ListView { public FullHeightListView(Context context) { super(context); } public FullHeightListView(Context context, AttributeSet attrs) { super(context, attrs); } public FullHeightListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // 强制让wrap_content计算所有子项的总高度 int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } }
然后布局里用这个自定义ListView,同时注意:
- NestedScrollView的布局参数设为
match_parent - ListView的高度设为
wrap_content
额外检查AppBarLayout和ViewPager的配置
确保你的布局结构和属性完全正确:
- ViewPager在CollapsingToolbarLayout内,设置
app:layout_scrollFlags="scroll|enterAlways" - AppBarLayout和CollapsingToolbarLayout都加上
android:fitsSystemWindows="true" - NestedScrollView必须设置
app:layout_behavior="@string/appbar_scrolling_view_behavior",这样才能和AppBarLayout联动滚动
给你个正确的布局结构示例参考:
<androidx.coordinatorlayout.widget.CoordinatorLayout android:layout_width="match_parent" android:layout_height="match_parent"> <com.google.android.material.appbar.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:fitsSystemWindows="true"> <com.google.android.material.appbar.CollapsingToolbarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:fitsSystemWindows="true" app:layout_scrollFlags="scroll|exitUntilCollapsed"> <androidx.viewpager.widget.ViewPager android:layout_width="match_parent" android:layout_height="200dp" app:layout_scrollFlags="scroll|enterAlways"/> <com.google.android.material.appbar.MaterialToolbar android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:layout_collapseMode="pin"/> </com.google.android.material.appbar.CollapsingToolbarLayout> </com.google.android.material.appbar.AppBarLayout> <androidx.core.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <!-- 这里放自定义FullHeightListView或者RecyclerView --> <com.yourpackage.FullHeightListView android:layout_width="match_parent" android:layout_height="wrap_content"/> </androidx.core.widget.NestedScrollView> </androidx.coordinatorlayout.widget.CoordinatorLayout>
最后提一句,尽量用RecyclerView吧,性能和兼容性都比ListView好太多,后续维护也省心~
内容的提问来源于stack exchange,提问作者Syed Sumair
相关产品推荐
相关产品推荐

