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)
}
}