How set scroll to bottom in recyclerview

22 views Asked by At

Tell me, what could be the problem? I'm creating a chat, and my recycleriew will scroll up by itself if there is any asynchronous loading of content. For example, I upload an image using the coil library and after downloading it, the list will scroll up by about half of the imageview. If you remove asynchronous loading, then everything works as it should

My recyclerView in xml:

  <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/messagesList"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_gravity="center_horizontal"
            android:orientation="vertical"
            app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
            app:layout_constraintBottom_toTopOf="@id/inputPanel"
            app:layout_constraintTop_toBottomOf="@id/conferencePanel"
            android:clipToPadding="false"
            tools:listitem="@layout/item_custom_outcoming_text_messages" />

recyclerview item with picture:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:paddingStart="45dp">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/bubble"
        style="@style/OutcomingBubble"
        android:layout_alignParentEnd="true"
        android:paddingStart="0dp"
        android:paddingTop="0dp"
        android:paddingEnd="0dp"
        android:paddingBottom="0dp">

        <com.google.android.material.imageview.ShapeableImageView
            android:id="@+id/imageAttach"
            android:layout_width="200dp"
            android:layout_height="200dp"
            android:adjustViewBounds="true"
            android:src="@drawable/ic_noimg"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.ImageAndText" />

        <TextView
            android:id="@+id/messageText"
            style="@style/TextMessagesOut"
            android:layout_width="0dp"
            android:layout_marginStart="16dp"
            android:layout_marginTop="14dp"
            android:layout_marginEnd="16dp"
            android:layout_marginBottom="16dp"
            android:focusableInTouchMode="true"
            android:visibility="gone"
            app:layout_constraintEnd_toEndOf="@id/imageAttach"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@id/imageAttach" />

        <LinearLayout
            android:id="@+id/inImgInfo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginEnd="5dp"
            android:layout_marginBottom="5dp"
            android:background="@drawable/rounded_layout_gray"
            android:gravity="center"
            android:orientation="horizontal"
            android:paddingTop="5dp"
            android:paddingBottom="5dp"
            app:layout_constraintBottom_toBottomOf="@id/imageAttach"
            app:layout_constraintEnd_toEndOf="@id/imageAttach">

            <TextView
                android:id="@id/messageTime"
                style="@style/TimeMessagesText"
                android:layout_marginStart="10dp"
                android:text="00:00"
                android:textColor="#99FFFFFF" />

            <ImageView
                android:id="@+id/checkMarkers"
                android:layout_width="15dp"
                android:layout_height="15dp"
                android:layout_marginStart="5.8dp"
                android:layout_marginEnd="8.2dp"
                android:src="@drawable/ic_check_send"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintTop_toBottomOf="@id/messageText"
                app:tint="#99FFFFFF" />
        </LinearLayout>

        <TextView
            android:id="@+id/bubbleTime"
            style="@style/TimeMessagesText"
            android:layout_below="@id/messageText"
            android:layout_marginEnd="3dp"
            android:layout_toEndOf="@id/messageText"
            android:text="00:00"
            android:visibility="gone"
            android:textColor="@color/time_messsage_out"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@id/bubbleCheckMarkers"
            app:layout_constraintTop_toBottomOf="@id/messageText" />

        <ImageView
            android:id="@+id/bubbleCheckMarkers"
            android:layout_width="15dp"
            android:layout_height="15dp"
            android:layout_marginStart="5dp"
            android:layout_marginEnd="5dp"
            android:layout_marginBottom="5dp"
            android:src="@drawable/ic_check_send"
            android:visibility="gone"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toBottomOf="@id/messageText"
            app:tint="@color/time_messsage_out" />
    </androidx.constraintlayout.widget.ConstraintLayout>
</RelativeLayout>

initialization recyclerView //reverseLayout = true

    private fun RecyclerView.initListMessage(
        repoAdapter: MessagesAdapter,
        pagingData: Flow<PagingData<MessageItem>>
    ) {

        val linearManager = LinearLayoutManager(requireContext(), VERTICAL,true)
        linearManager.scrollToPosition(0)
        layoutManager = linearManager

        lifecycleScope.launch {
            pagingData.collect(repoAdapter::submitData)
        }
        lifecycleScope.launch {
            waitForLoad(repoAdapter)
            adapter = repoAdapter
        }
    }

ViewHolder: loading image in onBindViewHolder

binding.imageAttach.loadUrlImage(content.uri)

fun ImageView.loadUrlImage(
    uri: String,
    signature: Long = 0L,
    placeholder: Int = R.drawable.ic_noimg
) {
    this.load(uri) {
        data(uri)

        placeholder(placeholder)
        error(placeholder)
        fallback(placeholder)
        if (signature != 0L) {
            memoryCacheKey(uri + signature)
            diskCacheKey(uri + signature)
        } else {
            memoryCacheKey(uri)
            diskCacheKey(uri)
        }
        diskCachePolicy(CachePolicy.ENABLED)
        memoryCachePolicy(CachePolicy.ENABLED)
    }

}
0

There are 0 answers