我正在使用StaggeredGridLayout构建应用程序。 但是一旦我打开了一个细节片段(由导航库处理),然后回到主片段,我的滚动位置就会丢失。
我已经尝试保存recyclerview的实例,以便在我们到达onResume后将其重新应用,但是此技术破坏了我的共享元素转换。
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/linear_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recentNotesList"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingStart="20dp"
android:paddingEnd="20dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<ProgressBar
android:id="@+id/loading_ui"
android:layout_width="75dp"
android:layout_height="75dp"
app:bindIsGone="@{thisVm.hasNotes}"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/nonethinking"
android:layout_width="0dp"
android:layout_height="0dp"
android:paddingStart="20dp"
android:paddingEnd="20dp"
android:scaleType="fitCenter"
android:src="@drawable/thinking"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
val lm = StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL)
lm.gapStrategy = StaggeredGridLayoutManager.GAP_HANDLING_NONE
binding.recentNotesList.layoutManager = lm
预期结果: 打开项目时->共享元素转换(此工作) 关闭打开的项目时->共享元素转换
实际结果: 关闭打开的项目时->共享元素转换仅在用户尚未滚动recyclerview时可见的图像时起作用。
我认为这与滚动位置保留过程有关。但是我无法使这个东西正常工作。
答案 0 :(得分:0)
您好,请在将adapater设置为recyclerview时尝试。
val lastFirstVisiblePositon= recyclerview.layoutmanager.findFirstCompletelyVisibleItemPosition();
recyclerview.layoutmanager.scrollToPositionWithOffset(lastFirstVisiblePosition, 0);
listdapter.notifyDataSetChanged();
hRecyclerView_OpenOrderListing.setAdapter(listdapter);
答案 1 :(得分:0)
我通过在我的recyclerview项目中使用ConstraintLayout修复了它。 只需将宽高比设置为默认值1:1,然后使用onBindViewHolder中应用的宽高比以编程方式更新此宽高比即可。
赞:
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/parentContsraint"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/show_image_note"
android:layout_width="0dp"
android:layout_height="0dp"
android:scaleType="centerCrop"
android:contentDescription="@string/image_of_your_dedicated_note"
android:transitionName="@{String.valueOf(note.id)}"
app:imageFromFile="@{note.image}"
app:srcCompat="@drawable/pool"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
with(set) {
val posterRatio = String.format("%d:%d", resource.width, resource.height)
clone(binding.parentContsraint)
setDimensionRatio(binding.showImageNote.id, posterRatio)
applyTo(binding.parentContsraint)
}