RecyclerView 分页时跳到列表中间
RecyclerView Jumps in middle of the list when paginatining
我有这个页面,我使用 RecyclerView
使用 MVVM 和分页设置并拉动刷新。
单击此 RecyclerView
中的一些项目将导航到另一个片段。
我的问题是,每当我第一次加载页面并一直向下滚动时,效果都很好。下拉刷新也可以。
但是当我导航到另一个片段并返回时,一直滚动到顶部,滑动刷新: RecyclerView
会跳到页面中间(就在我点击的项目上导航到另一个片段)
我的片段
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val adapter = GroupAdapter<ViewHolder>().apply { add(mainSection) }
val gridLayoutManager = GridLayoutManager(activity, adapter.spanCount)
gridLayoutManager.spanSizeLookup = adapter.spanSizeLookup
with(recyclerView) {
layoutManager = gridLayoutManager
setHasFixedSize(true)
addOnScrollListener(PaginationScrollListener {
viewModel.onEndOfList()
})
}
recyclerView.adapter = adapter
pullToRefresh.apply {
setProgressBackgroundColorSchemeColor(
ContextCompat.getColor(context, R.color.window_level_2)
)
setColorSchemeColors(ContextCompat.getColor(context, R.color.brand_primary))
setOnRefreshListener { viewModel.onRefresh() }
}
}
我的视图模型
fun onRefresh() {
page = 0
widgetItems.clear()
_widgetListObservable.postValue(widgetItems)
finishedLoading = false
isFirstFetch = true
getItems()
}
private fun getItems() {
isLoading = true
dataSource.getPage(page)
.subscribeOn(backgroundThread.getScheduler())
.observeOn(mainThread.getScheduler())
.flatMap {
Flowable.fromIterable(it)
.toList()
.toFlowable()
}
.doAfterTerminate {
isLoading = false
}
.subscribe(Consumer {
finishedLoading = it.isEmpty()
if (isFirstFetch && finishedLoading) {
_isMyPaymentsEmptyObservable.postValue(true)
}
widgetItems.addAll(it)
_widgetListObservable.postValue(widgetItems)
page++
isFirstFetch = false
}, {
println(it)
})
编辑
当我删除第一个片段中 swipeToRefresh
上的 onRefreshListener
时,它起作用了。我不知道为什么会这样?
感谢阅读。
尝试将这两个属性添加到 activity 的父布局。
android:focusableInTouchMode="true"
android:focusable="true"
RecyclerView 可能会将焦点存储到您单击的最后一个项目,或者有时 RecylerView 会在数据加载时自动滚动。
在尝试 DataSource
invalidate()
方法后没有成功。所以我将页面大小更改为 100,现在它加载到 0 位置
PagedList.Config config=new PagedList.Config.Builder().setPageSize(100).build();
dataSourceFactory = inventoryTransactionDao.getAllInventoryTransactions(new SimpleSQLiteQuery(queryString, args.toArray()));
LiveData<PagedList<TransactionHistory>> livePageList= new LivePagedListBuilder<>(dataSourceFactory,config).build();
我有这个页面,我使用 RecyclerView
使用 MVVM 和分页设置并拉动刷新。
单击此 RecyclerView
中的一些项目将导航到另一个片段。
我的问题是,每当我第一次加载页面并一直向下滚动时,效果都很好。下拉刷新也可以。
但是当我导航到另一个片段并返回时,一直滚动到顶部,滑动刷新: RecyclerView
会跳到页面中间(就在我点击的项目上导航到另一个片段)
我的片段
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val adapter = GroupAdapter<ViewHolder>().apply { add(mainSection) }
val gridLayoutManager = GridLayoutManager(activity, adapter.spanCount)
gridLayoutManager.spanSizeLookup = adapter.spanSizeLookup
with(recyclerView) {
layoutManager = gridLayoutManager
setHasFixedSize(true)
addOnScrollListener(PaginationScrollListener {
viewModel.onEndOfList()
})
}
recyclerView.adapter = adapter
pullToRefresh.apply {
setProgressBackgroundColorSchemeColor(
ContextCompat.getColor(context, R.color.window_level_2)
)
setColorSchemeColors(ContextCompat.getColor(context, R.color.brand_primary))
setOnRefreshListener { viewModel.onRefresh() }
}
}
我的视图模型
fun onRefresh() {
page = 0
widgetItems.clear()
_widgetListObservable.postValue(widgetItems)
finishedLoading = false
isFirstFetch = true
getItems()
}
private fun getItems() {
isLoading = true
dataSource.getPage(page)
.subscribeOn(backgroundThread.getScheduler())
.observeOn(mainThread.getScheduler())
.flatMap {
Flowable.fromIterable(it)
.toList()
.toFlowable()
}
.doAfterTerminate {
isLoading = false
}
.subscribe(Consumer {
finishedLoading = it.isEmpty()
if (isFirstFetch && finishedLoading) {
_isMyPaymentsEmptyObservable.postValue(true)
}
widgetItems.addAll(it)
_widgetListObservable.postValue(widgetItems)
page++
isFirstFetch = false
}, {
println(it)
})
编辑
当我删除第一个片段中 swipeToRefresh
上的 onRefreshListener
时,它起作用了。我不知道为什么会这样?
感谢阅读。
尝试将这两个属性添加到 activity 的父布局。
android:focusableInTouchMode="true"
android:focusable="true"
RecyclerView 可能会将焦点存储到您单击的最后一个项目,或者有时 RecylerView 会在数据加载时自动滚动。
在尝试 DataSource
invalidate()
方法后没有成功。所以我将页面大小更改为 100,现在它加载到 0 位置
PagedList.Config config=new PagedList.Config.Builder().setPageSize(100).build();
dataSourceFactory = inventoryTransactionDao.getAllInventoryTransactions(new SimpleSQLiteQuery(queryString, args.toArray()));
LiveData<PagedList<TransactionHistory>> livePageList= new LivePagedListBuilder<>(dataSourceFactory,config).build();