'Unable to scroll RecyclerView with Child items

I have a RecyclerView where in each item i can add X child items, when a parent item is added my RecyclerView scrolls to bottom but the issue is that when lot of child items are added to the last element it's not scrolling to last child (obviously as i'm doing scrollToPosition of last RecyclerView item).

So how should i perform the scrolling in the way that it scrolls to even last child not only the parent item?

Here a gif of how it looks like.

XML

    <androidx.coordinatorlayout.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/listView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:clipToPadding="false"
            app:stackFromEnd="true"
            android:paddingBottom="45dp"
            tools:listitem="@layout/comanda_list" />

     <com.google.android.material.floatingactionbutton.FloatingActionButton
            android:id="@+id/fabInvia"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:clickable="true"
            android:focusable="true"
            android:backgroundTint="#00C853"
            app:layout_anchor="@+id/bottomSheet"
            app:borderWidth="0dp"
            app:layout_anchorGravity="top|center"
            app:srcCompat="@drawable/ic_baseline_send"
            android:contentDescription="@string/verifica_gp" />

        <include layout="@layout/bottom_sheet_pterm" />

    </androidx.coordinatorlayout.widget.CoordinatorLayout>

Code where i add a child item in my Adapter

public void addChild(int position, Varianti variante) {
    comandeList.get(position).setVariant(variante);
    notifyItemChanged(position);
}

onBindViewHolder where the child items are rendered

    @Override
    public void onBindViewHolder(@NonNull final ExampleViewHolder holder, final int position) {
        final Comanda item = comandeList.get(position);
    ...
            List<Varianti> variants = item.getVarianti();
        if (variants != null && variants.size() > 0) {
            for (Varianti v : variants) {
                View vView = mInflater.inflate(R.layout.varianti_layout, holder.variantsContainer, false);
                TextView nameTV = vView.findViewById(R.id.variant_name);
                if (v.getState().equals("K") || v.getState().equals("KK")) {
                    nameTV.setTypeface(null, Typeface.BOLD);
                }
                if (!item.getState().equals("S")) {
                    nameTV.setTextColor(Color.parseColor("#FFFFFF"));
                }
                nameTV.setText(v.getDescrizione());
                nameTV.setBackground(v.getDrawable());
                holder.variantsContainer.addView(vView);

            }
        }
    ...

}

In activity after adding new item / child item

        adapterComanda.addVariante(position, variante);
        recyclerComanda.scrollToPosition(adapterComanda.getItemCount() - 1);

BottomSheet

<LinearLayout 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:id="@+id/bottomSheet"
    android:background="#FFFFFF"
    android:layout_width="match_parent"
    android:layout_height="450dp"
    app:layout_behavior="com.google.android.material.bottomsheet.BottomSheetBehavior"
    app:behavior_hideable="false"
    android:elevation="5dp"
    app:behavior_peekHeight="60dp"
    android:orientation="vertical">

... (different LinearLayouts)

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:animateLayoutChanges="true"
        android:gravity="bottom"
        android:orientation="vertical">

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerViewTasti"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginTop="50dp"
            android:paddingTop="3dp"
            android:paddingBottom="3dp"
            tools:listitem="@layout/tasto_list"
            app:spanCount="4"
            android:scrollbars="vertical"
            app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" />

</LinearLayout>


</LinearLayout>


Solution 1:[1]

The issue with your code is it is Scrolling to the bottom, but the recycler view is going below the <include layout="@layout/bottom_sheet_pterm" />

Try setting a layout_anchor

<androidx.recyclerview.widget.RecyclerView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clipToPadding="false"
        android:paddingBottom="45dp"
        app:layout_anchor="@+id/fabInvia"
        app:stackFromEnd="true" />

Or use a constraintlayout which constraints bottom to top of fabInvia.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Sayok Majumder