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)