前言:使用NestedScrollView嵌套RecyclerView。
解决步骤一:固定高度
NestedScrollView嵌套RecyclerView时,RecyclerView的高度是无限大,所以要将RecyclerView设置固定高度。在代码中固定的,灵活度更高。
java
binding.nestedScrollV.post(new Runnable() {
@Override
public void run() {
binding.selectList.getLayoutParams().height = binding.nestedScrollV.getHeight(); // 使用NestedScrollView的高度
binding.productList.getLayoutParams().height = binding.nestedScrollV.getHeight();
binding.selectList.setLayoutParams(binding.selectList.getLayoutParams());
binding.productList.setLayoutParams(binding.productList.getLayoutParams());
});
解决步骤二:重写NestedScrollView的 measureChildWithMargins**()**函数
java
public class MNestedScrollViewBox extends NestedScrollView {
public MNestedScrollViewBox(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
// 使用NestedScrollView嵌套RecyclerView,会导致RecyclerView复用机制失效,RecyclerView会将所有数据一次性全部加载。
// 解决方法:重写measureChildWithMargins,让NestedScrollView测量RecyclerView时 不使用MeasureSpec.UNSPECIFIED模式即可。
@Override
protected void measureChildWithMargins(View child, int parentWidthMeasureSpec, int widthUsed, int parentHeightMeasureSpec, int heightUsed) {
child.measure(parentWidthMeasureSpec, parentHeightMeasureSpec);
}
}
使用:
java
<?xml version="1.0" encoding="utf-8"?>
<com.xx.xx.ui.widget.MNestedScrollViewBox 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"
android:background="@color/color_F5F6F7"
android:fillViewport="true"
android:overScrollMode="never"
tools:context=".ui.fragment.shopdetail.OrderFoodFragment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/select_list"
android:layout_width="84dp"
android:layout_height="match_parent"
android:overScrollMode="never"
tools:listitem="@layout/widget_select_item_ho" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/product_list"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@color/white"
android:overScrollMode="never"
android:paddingStart="8dp"
tools:ignore="RtlSymmetry"
tools:listitem="@layout/widget_product_item_ho" />
</LinearLayout>
</com.xx.xx.ui.widget.MNestedScrollViewBox>