Recyclerview setzt die Position nach ungültigem PagingSource zurück
Posted: 18 Mar 2025, 15:42
Es gibt ein Wohnmobil, auf dem Daten über einen Paging -Adapter Seite auf Seite geladen werden. Nach dem Drücken der Aktualisierungstaste möchten ich die sichtbaren Elemente durch Laden der erforderlichen Seiten von der API aktualisieren. Aus irgendeinem Grund geht an einigen Stellen die Position im Wohnmobil verloren. Dies ist beispielsweise zu sehen, wenn Sie auf Element 2,10: 50: CRS-13 stehen und auf Aktualisieren < /p>
MainActivity < /p>
drücken
Wie kann ich die Daten der erforderlichen Seiten aktualisieren?>
MainActivity < /p>
drücken
Code: Select all
class MainActivity : AppCompatActivity() {
private val viewModel: MainViewModel by viewModels()
private val launchesPagingAdapter: LaunchesPagingAdapter by lazy {
LaunchesPagingAdapter()
}
private lateinit var recyclerView: RecyclerView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContentView(R.layout.activity_main)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
recyclerView = findViewById(R.id.rv_items).apply {
adapter = launchesPagingAdapter
}
findViewById(R.id.btn_refresh).apply {
setOnClickListener {
viewModel.refresh()
}
}
lifecycleScope.launch {
viewModel.launchesPagingData.collect { pagingData ->
launchesPagingAdapter.submitData(pagingData)
}
}
}
}
< /code>
ViewModel < /p>
class MainViewModel : ViewModel() {
private var launchesPagingSource: LaunchesPagingSource? = null
get() {
if (field == null || field?.invalid == true) {
field = LaunchesPagingSource()
}
return field
}
val launchesPagingData = Pager(
PagingConfig(pageSize = 20, initialLoadSize = 20, prefetchDistance = 10)
) {
launchesPagingSource!!
}.flow
.cachedIn(viewModelScope)
fun refresh() {
launchesPagingSource?.invalidate()
}
}