Search code examples
androidkotlinandroid-recyclerviewsmooth-scrollingandroid-nestedscrollview

RecyclerView smoothScrollToPosition() is not working with nestedScrollView. I want to scroll to the bottom whenever the fragment is created


I have a nested scroll view, inside it there's an image view and a recycler view. I want recycler view to scroll all the way to the bottom whenever onResume() fragment method is called. Current Behavior is that it open the screen as the normal screen and didn't scroll at all.

I have tried various solutions but nothing is working.

This is the code for layout and Fragment class. Please help me. Nothing is happening.

<androidx.core.widget.NestedScrollView
            android:id="@+id/nestedScrollView"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:fillViewport="true"
            android:focusableInTouchMode="true"
            android:fitsSystemWindows="true"
            app:layout_constraintBottom_toTopOf="@+id/btnCall"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.0"
            app:layout_constraintVertical_chainStyle="spread_inside">

            <androidx.constraintlayout.widget.ConstraintLayout
                android:id="@+id/constraintLayout"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:descendantFocusability="blocksDescendants"
                app:layout_constraintBottom_toTopOf="@+id/btnYouGave"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintVertical_bias="0.0"
                app:layout_constraintVertical_chainStyle="spread_inside">

                <de.hdodenhof.circleimageview.CircleImageView
                    android:id="@+id/ivTransactionProfileImage"
                    android:layout_width="102dp"
                    android:layout_height="102dp"
                    android:layout_marginTop="16dp"
                    android:src="@drawable/ic_panda"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toTopOf="parent" />

                <androidx.recyclerview.widget.RecyclerView
                    android:id="@+id/recyclerViewTrnsaction"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="16dp"
                    app:layout_constraintVertical_bias="0.0"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toBottomOf="@+id/ivTransactionProfileImage" />

            </androidx.constraintlayout.widget.ConstraintLayout>

        </androidx.core.widget.NestedScrollView>





override fun onResume() {
    super.onResume()
    mainActivity.supportActionBar?.title = args.name
    recyclerViewTrnsaction.layoutManager = LinearLayoutManager(activity)

    launch {
        context?.let {
            val transactions = getAllTransactions(args.id)
            recyclerViewTrnsaction.adapter = TransactionAdapter(transactions)
            nestedScrollView.smoothScrollTo(0, nestedScrollView.height)
            recyclerViewTrnsaction.smoothScrollToPosition(recyclerViewTrnsaction.adapter!!.itemCount)
        }
    }
}

Solution

  • Try scrolling the NestedScrollView instead of RecyclerView using this.

    Replace the smooth scrolling code with

    nestedScrollView.post {
       nestedScrollView.fullScroll(View.FOCUS_DOWN)
     }