Android 调用notifyDataSetChanged()时,RecycleView跳到顶部
我有一个片段,其中包含Android 调用notifyDataSetChanged()时,RecycleView跳到顶部,android,android-layout,android-activity,android-recyclerview,Android,Android Layout,Android Activity,Android Recyclerview,我有一个片段,其中包含swipeRefreshLayout和无限recyclerView。我的片段布局代码类似于: <androidx.constraintlayout.widget.ConstraintLayout . . . android:layout_height="match_parent" android:layout_width="match_parent" android:cli
swipeRefreshLayout
和无限recyclerView
。我的片段布局代码类似于:
<androidx.constraintlayout.widget.ConstraintLayout
.
.
.
android:layout_height="match_parent"
android:layout_width="match_parent"
android:clickable="true"
android:focusable="true"
android:focusableInTouchMode="true">
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
.
.
.
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="parent" >
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_main_news"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
更新时,您可以尝试保存RV的滚动状态:
val recyclerViewState = rv.layoutManager?.onSaveInstanceState()
adapter.notifyDataSetChanged()
rv?.layoutManager?.onRestoreInstanceState(recyclerViewState)
当
notifyDataSetChanged
调用的整个视图被刷新时,会出现这种情况。当您返回到调用onResume的片段时,随后也会调用您的notifyDataSetChanged
。这就是您看到第一项的原因
因此,为了防止这种情况发生,您需要在整个数据发生更改或需要更新时调用notifyDataSetChanged
我可以给你一些建议
从onResume中删除notifyDataSetChanged并使用diffUtil
进行recyclerView数据更新。它将只更新您更改的项目。仅在必要时更新数据,例如,如果您更新了详细信息中的任何数据并希望在列表中更新,则可以覆盖活动结果中的通知列表。或者您可以在您的列表片段和通知列表中发送和接收广播
提前感谢,希望这会有所帮助。您可以添加[Java/Kotlin]代码吗?(关于刷新部分)请将代码粘贴到您通知的位置RecyclerView@Squti我已经更新了我的问题。谢谢回复。我试过了,但没用,循环视图还是跳到了顶部。谢谢回复。在我的应用程序中,当我们单击列表中的项目时,在详细信息页面中,我们可以更改应用程序设置,如字体大小。所以当我们回到列表时,列表应该根据需要进行更新。列表数据并没有增加。所以我别无选择,只能调用notifyDataSetChanged()。我认为解决方案是将diffUtil用于recyclerView。如果你不知道,网上有很多资源。请应用它并让我知道更新
val recyclerViewState = rv.layoutManager?.onSaveInstanceState()
adapter.notifyDataSetChanged()
rv?.layoutManager?.onRestoreInstanceState(recyclerViewState)