2

我正在尝试使用 制作粘性图像的水平列表,RecyclerView并且我想将它们移动像素的偏移量scrollToPositionWithOffset。我想传递0asposition和我想向右/向左移动的像素 as offset

但它不起作用,列表保持不变,未滚动,它不会移动。这是我的实现:

final LargeImageAdapter mLargeImageAdapter = new LargeImageAdapter(this);
linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false);
recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.setAdapter(mLargeImageAdapter);

seekBar = (SeekBar)findViewById(R.id.seekBar);
seekBar.setMax(7000);
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        int scrollToDX = progress;

        ((LinearLayoutManager)recyclerView.getLayoutManager()).scrollToPositionWithOffset(0, scrollToDX);
        // tried invoking also linearLayoutManager instead getLayoutManager.
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {

    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {

    }
});

我究竟做错了什么?

非常感谢。

问候。

拉斐尔。

4

5 回答 5

5

我终于用了:

recyclerView.scrollBy(int offsetX, int offsetY);设置offsetY = 0,它现在可以工作了。

我不明白该函数的用途是什么scrollToPositionWithOffset

于 2015-11-11T14:02:31.887 回答
3

我有一个类似的问题。我的问题是我的 recyclerview 与其父布局的大小不同。我通过将回收站视图的宽度和高度设置为match_parent. 我不知道为什么会在这种情况下发生这种情况。

于 2016-08-04T16:07:40.677 回答
0

您的第一个问题的迟到答案,以及您的答案的补充:

您的方法更适合您的个人需求,因为scrollToPositionWithOffset它并非旨在做您想做的事。

正如文档在这里所说

[...]解决的布局开始取决于 [...] getLayoutDirection(android.view.View) [...]

这意味着它会在您的情况下垂直偏移布局方向的滚动目标位置。

我不明白函数 scrollToPositionWithOffset 的用途是什么。

它不仅允许滚动到列表中的给定项目,还允许将其定位在更“可见”或其他方便的位置。

于 2016-03-11T22:04:22.633 回答
0

最近我也遇到了这个问题,我直接调用scrollToPositionWithOffset onScrolled()但没有任何改变,我转向scrollToPosition()甚至scrollBy()但没有帮助,最后我尝试延迟它所以它工作,第一次延迟50ms,但是两周后我发现这还不够,所以我在没有任何方法的情况下增加到100ms,当然它工作,只是感觉有点不安。

val layoutManager = LinearLayoutManager(hostActivity, VERTICAL, false)
fileRv.layoutManager = layoutManager
fileRv.addOnScrollListener(object : RecyclerView.OnScrollListener() {
    override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
        if (dx == 0 && dy == 0) {
            scrollToLastPosition()
        }
    }

    private fun scrollToLastPosition() {
        val lastScrollPosition = viewModel.consumeLastScrollPosition()
        if (lastScrollPosition > 0) {
            Handler().postDelayed({ layoutManager.scrollToPositionWithOffset(lastScrollPosition, 0) }, 100)
        }
    }
})

override fun onItemClick(position: Int) {
    layoutManager.findFirstVisibleItemPosition().let {
        if (it >= 0) viewModel.markLastScrollPosition(it)
    }
}

fun markLastScrollPosition(position: Int) {
    currentFolderListData.value?.lastOrNull()?.lastScrollPosition = position
}

fun consumeLastScrollPosition(): Int {
    currentFolderListData.value?.lastOrNull()?.run {
        return lastScrollPosition.apply { lastScrollPosition = -1 }
    }
    return 0
}
于 2021-12-08T03:53:52.453 回答
0

我找到了解决办法。因为我是 DNA Launcher 的开发者。当我使用RecyclerView显示AZ App List时,发现scrollToPositionWithOffset这个函数不起作用。我跟踪了将近一天的问题,我想通了。

当 RecyclerView 再次显示时,只需让 RecyclerView 的父级做 requestLayout。

这个对我有用。

而且我知道如何使函数 scrollToPositionWithOffset 不起作用。你只需要在它上面添加一个视图然后让它消失。

于 2022-02-15T13:52:43.800 回答