使用NestedScrollView嵌套RecyclerView,item内有许多个EditText

572 阅读3分钟

问题

EditText点击获取焦点后,会躲在输入法后面

场景描述

使用NestedScrollView嵌套RecyclerView,item内有输入框;在前面两个item的时候,都能正常输入;但是从第三个item开始,输入框就会躲在键盘后面,没办法被键盘顶上去

ErrorEditText输入框是正常的EditText输入框,只是添加了自定义的属性

xml布局

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

    </data>

    <androidx.constraintlayout.widget.ConstraintLayout

        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".main.orderdetail.bindbar.BindBarActivity">

        <include
            android:id="@+id/title"
            layout="@layout/layout_title" />

        <androidx.core.widget.NestedScrollView
            android:id="@+id/scrollView"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:scrollbars="none"
            android:paddingEnd="16dp"
            android:paddingStart="16dp"
            app:layout_constraintBottom_toTopOf="@+id/tx_nums"
            app:layout_constraintTop_toBottomOf="@+id/title">

            <androidx.constraintlayout.widget.ConstraintLayout
                android:id="@+id/con_context"

                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                >

                <androidx.constraintlayout.widget.ConstraintLayout
                    android:id="@+id/con_top"
                    android:layout_width="match_parent"
                    android:layout_height="0dp"
                    android:layout_marginTop="16dp"
                    android:background="@drawable/item_dialog_bg"
                    android:elevation="2dp"
                    android:paddingBottom="16dp"
                    app:layout_constraintTop_toTopOf="parent">

                    <TextView
                        android:id="@+id/tx_name"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginStart="12dp"
                        android:layout_marginTop="16dp"
                        android:text="物资名称"
                        android:textColor="@color/ed_content"
                        android:textSize="16sp"
                        app:layout_constraintStart_toStartOf="parent"
                        app:layout_constraintTop_toTopOf="parent" />

                    <ImageView
                        android:id="@+id/img_logo"
                        android:layout_width="90dp"
                        android:layout_height="90dp"
                        android:layout_marginLeft="12dp"
                        android:layout_marginTop="8dp"
                        android:scaleType="centerInside"
                        app:layout_constraintStart_toStartOf="parent"
                        app:layout_constraintTop_toBottomOf="@+id/tx_name" />

                    <TextView
                        android:id="@+id/tx_detail"
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_marginLeft="14dp"
                        android:layout_marginRight="12dp"
                        android:lineSpacingExtra="8dp"
                        android:text="单价: \n物品规格: \n包装规格: "
                        android:textColor="@color/tip"
                        android:textSize="12sp"
                        app:layout_constraintEnd_toEndOf="parent"
                        app:layout_constraintStart_toEndOf="@+id/img_logo"
                        app:layout_constraintTop_toTopOf="@+id/img_logo" />

                    <TextView
                        android:id="@+id/tip1"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginLeft="14dp"
                        android:layout_marginTop="12dp"
                        android:background="@drawable/tx_bg_blue"
                        android:gravity="center"
                        android:text="一码多物"
                        android:textColor="@color/tx_tip_blue"
                        android:textSize="11sp"
                        app:layout_constraintTop_toBottomOf="@+id/tx_detail"
                        app:layout_constraintStart_toEndOf="@+id/img_logo" />

                    <TextView
                        android:id="@+id/tip2"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginLeft="12dp"
                        android:background="@drawable/tx_bg_low"
                        android:gravity="center"
                        android:text="低值耗材"
                        android:textColor="@color/tx_tip_low"
                        android:textSize="11sp"
                        app:layout_constraintBottom_toBottomOf="@+id/tip1"
                        app:layout_constraintStart_toEndOf="@+id/tip1" />

                </androidx.constraintlayout.widget.ConstraintLayout>

                <ImageView
                    android:id="@+id/img_title_stocking"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="20dp"
                    android:src="@drawable/home_ico_title"
                    app:layout_constraintLeft_toLeftOf="parent"
                    app:layout_constraintTop_toBottomOf="@+id/con_top" />

                <TextView
                    android:id="@+id/tx_stocking"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="6dp"
                    android:text="填写条形码信息"
                    android:textColor="@color/tip"
                    android:textSize="16sp"
                    app:layout_constraintBottom_toBottomOf="@+id/img_title_stocking"
                    app:layout_constraintLeft_toRightOf="@+id/img_title_stocking" />

                <androidx.recyclerview.widget.RecyclerView
                    android:id="@+id/recyclerView"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="8dp"
                    android:nestedScrollingEnabled="false"
                    app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
                    app:layout_constraintBottom_toTopOf="@+id/space"
                    app:layout_constraintTop_toBottomOf="@+id/img_title_stocking"
                    tools:listitem="@layout/item_bindbar" />
<!--使用空白,将RecyclerView底部顶到按钮上面-->
                <Space
                    android:id="@+id/space"
                    android:layout_width="0dp"
                    android:layout_height="0dp"
                    android:layout_marginTop="80dp"
                    app:layout_constraintBottom_toBottomOf="@+id/con_context"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toBottomOf="@+id/recyclerView" />
            </androidx.constraintlayout.widget.ConstraintLayout>

        </androidx.core.widget.NestedScrollView>

        <TextView
            android:id="@+id/tx_nums"
            android:layout_width="0dp"
            android:layout_height="49dp"
            android:background="@color/white"
            android:contentDescription="完成匹配数量"
            android:elevation="2dp"
            android:gravity="center_vertical"
            android:paddingLeft="12dp"
            android:text="绑码数量:0/0"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@+id/btn_send"
            app:layout_constraintStart_toStartOf="parent" />


        <Button
            android:id="@+id/btn_send"
            android:layout_width="wrap_content"
            android:layout_height="49dp"
            android:background="@drawable/btn_send_bg"
            android:elevation="2dp"
            android:enabled="false"
            android:gravity="center_vertical"
            android:paddingLeft="32dp"
            android:paddingRight="32dp"
            android:text="完成绑码"
            android:textColor="@color/white"
            android:textSize="16sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent" />

        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/btn_add"
            android:layout_width="0dp"
            android:layout_height="40dp"
            android:layout_marginStart="66dp"
            android:layout_marginEnd="66dp"
            android:layout_marginBottom="20dp"
            android:background="@drawable/bg_btn_white_r20"
            android:elevation="4dp"
            android:text="添加耗材条形码"
            android:textColor="@color/main_blue"
            android:textSize="15sp"
            app:layout_constraintBottom_toTopOf="@+id/tx_nums"
            app:layout_constraintCircleRadius="10dp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

item布局

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tool="http://schemas.android.com/tools">

    <data>

    </data>

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/ed_bg_white"
        android:elevation="2dp"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:padding="12dp">

        <TextView
            android:id="@+id/tx_tip1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="2dp"
            android:text="匹配数量:"
            android:textColor="@color/ed_hint"
            android:textSize="16sp"
            android:textStyle="bold"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />


        <TextView
            android:id="@+id/tx_tip2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:text="绑码数量:"
            android:textColor="@color/tip"
            android:textSize="14sp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/tx_tip1" />

        <TextView
            android:id="@+id/tx_tip3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="24dp"
            android:text="条形码编号:"
            android:textColor="@color/tip"
            android:textSize="14sp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/tx_tip2" />

        <TextView
            android:id="@+id/tx_tip4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="24dp"
            android:text="生产批号:"
            android:textColor="@color/tip"
            android:textSize="14sp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/tx_tip3" />

        <TextView
            android:id="@+id/tx_tip5"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="24dp"
            android:text="序列号:"
            android:textColor="@color/tip"
            android:textSize="14sp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/tx_tip4" />

        <TextView
            android:id="@+id/tx_tip6"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="24dp"
            android:text="灭菌批号:"
            android:textColor="@color/tip"
            android:textSize="14sp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/tx_tip5" />

        <TextView
            android:id="@+id/tx_tip7"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="24dp"
            android:text="生产日期:"
            android:textColor="@color/tip"
            android:textSize="14sp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/tx_tip6" />

        <TextView
            android:id="@+id/tx_tip8"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="24dp"
            android:text="有效期至:"
            android:textColor="@color/tip"
            android:textSize="14sp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/tx_tip7" />
        <!--    上面在Guideline左边的布局-->

        <androidx.constraintlayout.widget.Barrier
            android:id="@+id/barrier"
            android:layout_width="10dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="10dp"
            android:orientation="vertical"
            app:barrierDirection="end"
            app:constraint_referenced_ids="tx_tip3" />
        <!--    下面的布局在Guideline的右边布局-->

        <androidx.appcompat.widget.AppCompatImageView
            android:id="@+id/img_check"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="12dp"
            android:background="@mipmap/ico_cancle_pink"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/tx_num_matching"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="10dp"
            android:text="0"
            android:textColor="@color/ed_hint"
            android:textSize="16sp"
            android:textStyle="bold"
            app:layout_constraintStart_toEndOf="@+id/barrier"
            app:layout_constraintTop_toTopOf="@+id/tx_tip1" />

        <ErrorEditText
            android:id="@+id/ed_bind_num"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="10dp"
            android:backgroundTint="@color/line"
            android:inputType="number"
            android:textColor="@color/ed_content"
            android:textSize="14sp"
            app:layout_constraintBaseline_toBaselineOf="@+id/tx_tip2"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@+id/barrier"
            android:hint="请输入绑码数量"
            android:textColorHint="@color/ed_hint" />

        <ErrorEditText
            android:id="@+id/ed_bar_num"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="10dp"
            android:backgroundTint="@color/line"
            android:hint="可直接输入或者用终端扫描"
            android:textColor="@color/ed_content"
            android:textColorHint="@color/ed_hint"
            android:textSize="14sp"
            tool:text="可直接输入或者用终端扫描可直接输入或者用终端扫描可直接输入或者用终端扫描可直接输入或者用终端扫描可直接输入或者用终端扫描可直接输入或者用终端扫描可直接输入或者用终端扫描"
            android:maxLines="1"
            app:layout_constraintBaseline_toBaselineOf="@+id/tx_tip3"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@+id/barrier" />

        <ErrorEditText
            android:id="@+id/ed_batch_num"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="10dp"
            android:backgroundTint="@color/line"
            android:hint="可直接输入或者用终端扫描"
            android:textColor="@color/ed_content"
            android:textColorHint="@color/ed_hint"
            android:textSize="14sp"
            app:layout_constraintBaseline_toBaselineOf="@+id/tx_tip4"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@+id/barrier" />

        <ErrorEditText
            android:id="@+id/ed_serial_num"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="10dp"
            android:backgroundTint="@color/line"
            android:hint="可直接输入或者用终端扫描"
            android:inputType="number"
            android:textColor="@color/ed_content"
            android:textColorHint="@color/ed_hint"
            android:textSize="14sp"
            app:layout_constraintBaseline_toBaselineOf="@+id/tx_tip5"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@+id/barrier" />

        <ErrorEditText
            android:id="@+id/ed_uht_num"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="10dp"
            android:backgroundTint="@color/line"
            android:hint="可直接输入或者用终端扫描"
            android:textColor="@color/ed_content"
            android:textColorHint="@color/ed_hint"
            android:textSize="14sp"
            app:layout_constraintBaseline_toBaselineOf="@+id/tx_tip6"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@+id/barrier" />

        <ErrorEditText
            android:id="@+id/ed_product_num"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="10dp"
            android:backgroundTint="@color/line"
            android:focusable="false"
            android:focusableInTouchMode="false"
            android:hint="请选择生产日期"
            android:textColor="@color/ed_content"
            android:textColorHint="@color/ed_hint"
            android:textSize="14sp"
            app:layout_constraintBaseline_toBaselineOf="@+id/tx_tip7"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@+id/barrier" />

        <ImageView
            android:id="@+id/img_product"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="8dp"
            android:padding="5dp"
            android:src="@mipmap/ico_more"

            app:layout_constraintBottom_toBottomOf="@+id/ed_product_num"
            app:layout_constraintEnd_toEndOf="@+id/ed_product_num"
            app:layout_constraintTop_toTopOf="@+id/ed_product_num" />


        <ErrorEditText
            android:id="@+id/ed_valid_num"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginStart="10dp"
            android:backgroundTint="@color/line"
            android:focusable="false"
            android:focusableInTouchMode="false"
            android:hint="请选择生产日期"
            android:textColor="@color/ed_content"
            android:textColorHint="@color/ed_hint"
            android:textSize="14sp"
            app:layout_constraintBaseline_toBaselineOf="@+id/tx_tip8"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toEndOf="@+id/barrier" />

        <ImageView
            android:id="@+id/img_valid"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="8dp"
            android:padding="5dp"
            android:src="@mipmap/ico_more"
            app:layout_constraintBottom_toBottomOf="@+id/ed_valid_num"
            app:layout_constraintEnd_toEndOf="@+id/ed_valid_num"
            app:layout_constraintTop_toTopOf="@+id/ed_valid_num" />

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

尝试解决

RecyclerView键盘遮挡EditText,实现和scrollView一样。

测试经历

直接使用RecyclerView内包含EditText

不论在哪个item都能正常使用输入框,键盘顶起输入框

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".test.TestActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
        app:layout_constraintTop_toTopOf="parent" />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="添加"
        android:id="@+id/btn_add"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

没有顶部布局,使用NestedScrollView嵌套RecyclerView,item内有输入框

键盘也一样,无法正常顶起输入框;可以确定是在NestedScrollView嵌套RecyclerView之后,导致无法正常让键盘计算高度

在输入框获取焦点后,立马滑动列表到当前position

可以解决单个输入框被键盘弹珠的情况;但是,一旦是连续输入,需要涉及到键盘收缩、显示的时候,就会发现有的时候,你没办法控制焦点、列表的滑动等动作;在第一个输入框输入完毕后,切换第二个输入框,焦点会变得复杂起来;有可能往回修改输入错误;也会是正常操作,继续往下输入;下一行的输入框,可以设置键盘事件,下一个【这个没有尝试;我使用的是手动滑动到下一个;可以想象当时的场景;下一个输入框是在键盘后面的,不说了这是真复杂】

最终解决方法

经过测试经历,

分析布局

使用NestedScrollView嵌套RecyclerView;是为了方便添加头部、底部的布局

重新布局

使用RecyclerView加头尾布局,来处理;因为RecyclerView是支持输入框的,而且不用自己来处理焦点键盘的事件,少了很多代码

xml布局
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

    </data>

    <androidx.constraintlayout.widget.ConstraintLayout

        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:focusable="true"
        android:focusableInTouchMode="true"
        tools:context=".main.orderdetail.bindbar.BindBarActivity">

        <include
            android:id="@+id/title"
            layout="@layout/layout_title" />

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_marginStart="16dp"
            android:layout_marginEnd="16dp"
            app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
            app:layout_constraintBottom_toTopOf="@+id/tx_nums"
            app:layout_constraintTop_toBottomOf="@+id/title"
            tools:listitem="@layout/item_bindbar" />


        <TextView
            android:id="@+id/tx_nums"
            android:layout_width="0dp"
            android:layout_height="49dp"
            android:background="@color/white"
            android:contentDescription="完成匹配数量"
            android:elevation="2dp"
            android:gravity="center_vertical"
            android:paddingLeft="12dp"
            android:text="绑码数量:0/0"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@+id/btn_send"
            app:layout_constraintStart_toStartOf="parent" />


        <Button
            android:id="@+id/btn_send"
            android:layout_width="wrap_content"
            android:layout_height="49dp"
            android:background="@drawable/btn_send_bg"
            android:elevation="2dp"
            android:enabled="false"
            android:gravity="center_vertical"
            android:paddingLeft="32dp"
            android:paddingRight="32dp"
            android:text="完成绑码"
            android:textColor="@color/white"
            android:textSize="16sp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent" />


    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

就剩一个RecyclerView

adapter代码

涉及到适配器,所以贴出来


/**
* Author by firetomato, Github:{  @link  <a href="https://github.com/burningtomato">...</a>}, Date on 2022/11/15.
* PS: Not easy to write code, please indicate.
*/
public class BindBarAdapter extends RecyclerView.Adapter {
    private List<你自己的Bean> datas = new ArrayList<>();
    private static final int HeadType = 0;
    private static final int NormalType = 1;
    private static final int FootType = 2;

    @Override
    public int getItemViewType(int position) {
        if (position == 0) {
            return HeadType;
        }
        else if (getItemCount()-1==position) {
//底部布局
            return FootType;
        }
        return NormalType;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        if (viewType==HeadType) {
//            头部布局
           return new HeadView(ItemTopBindBarBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
        }else if (viewType==FootType) {
//            底部布局
            return new FootView(ItemBottomBindBarBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false));
        }else{
//            正常布局
            return new NormalView(ItemBindbarBinding.inflate(LayoutInflater.from(parent.getContext()),parent,false));
        }
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        if (position==0) {
            initTopData((HeadView)holder);
        }
        else if (position==getItemCount()-1) {
//            底部布局
            initBottomData((FootView)holder);
        }
        else{
//            正常布局 position-1:去掉头部item
            initNormalData((NormalView)holder, position);
        }
    }

    private void initBottomData(FootView holder) {
        ...
    }

    private void initNormalData(NormalView holder, int position) {
        if (datas.size()==0) {
            return;
        }
        ...
    }
     
    /**
* 显示顶部数据
*  @param  stockingMatchBean
*/
private void initTopData(HeadView headView) {
       ...
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position, @NonNull List payloads) {
        super.onBindViewHolder(holder, position, payloads);
    }

    @Override
    public int getItemCount() {
//        头部、底部
        return datas.size()+2;
    }

    public void addData(BindBarGetBean bindBarGetBean){
        datas.add(bindBarGetBean);
        notifyItemInserted(datas.size()+1);
    }

    public void addData(List<BindBarGetBean> bindBarGetBean){
        datas.addAll(bindBarGetBean);
        notifyItemInserted(datas.size()+1);
    }

    public List<BindBarGetBean> getDatas() {
        return datas;
    }

    

    class HeadView extends RecyclerView.ViewHolder{
        ItemTopBindBarBinding binding;
        public HeadView(@NonNull ItemTopBindBarBinding itemView) {
            super(itemView.getRoot());
            binding = itemView;
        }
    }

    class NormalView extends RecyclerView.ViewHolder{
        ItemBindbarBinding binding;
        public NormalView(@NonNull ItemBindbarBinding itemView) {
            super(itemView.getRoot());
            binding = itemView;
        }
    }

    class FootView extends RecyclerView.ViewHolder{
        ItemBottomBindBarBinding binding;
        public FootView(@NonNull ItemBottomBindBarBinding itemView) {
            super(itemView.getRoot());
            binding = itemView;
        }
    }



}

总结

使用NestedScrollView嵌套RecyclerView,方便编写xml;

但是嵌套很多

使用RecyclerView添加头尾布局;可以减少嵌套;但是,在分割线的问题上,你的自己有能力去处理

闲聊

其实刚开始在另一个布局的时候,我是使用后一种方式的,但是那个布局有分割线;本人比较菜,所以,没跨过那个坑,只好找到了NestedScrollView嵌套RecyclerView,来添加头、尾布局;结果竟然在适配输入法的时候,又进坑了,还是个大坑;技术不高,哪里的问题,都是个大坑,就看你本事硬不硬了。