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();