RecylerView无需动画即可滚动到所需位置

时间:2015-12-06 12:04:38

标签: android

以前,当我想将ListView滚动到所需位置时,我会使用

listView.setSelection(row);

ListView将滚动而不显示任何动画 - Android List View set default position without animation

现在,我想在RecyclerView上达到同样的效果。我尝试执行

((LinearLayoutManager)recyclerView.getLayoutManager()).scrollToPositionWithOffset(row, 0);

然而,有滚动动画,我想避免。

有没有办法可以在没有动画的情况下以编程方式滚动?

这是我想要的动画 - https://youtu.be/OKsUKwBLoks

注意,我已经尝试过以下方法。所有这些都会生成动画。

  • scrollToPositionWithOffset
  • smoothScrollToPosition
  • scrollToPosition

4 个答案:

答案 0 :(得分:3)

在layout.xml中添加此行

android:overScrollMode="never"

修改

滚动recycleview的另一种方法

recyclerView.smoothScrollToPosition(position);

答案 1 :(得分:2)

我知道我对这个答案有些迟了,但它可能会对其他人有所帮助。 尝试执行以下操作(至少在使用时看不到任何动画):

科特琳:

    //-- Immediately jump to the position in RecyclerView without delay or animation.
    mRecyclerView.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
        override fun onGlobalLayout() {
            mRecyclerView.scrollToPosition(position)
            mRecyclerView.viewTreeObserver.removeOnGlobalLayoutListener(this)
        }
    })

Java:

mRecyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            mRecyclerView.scrollToPosition(position);
            mRecyclerView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        }
});

答案 2 :(得分:1)

您可以在不使用动画的情况下滚动:

recyclerView.scrollToPosition(position)

答案 3 :(得分:0)

当您同时使用notifyItemInserted()致电scrollToPosition()时,可以轻松重新生成此内容。

动画是由RecyclerView默认项目动画类中的DefaultItemAnimator引起的。

我发现Youtube video重新产生了其他人的问题。

我也有解决方案:

  • 首先,使用scrollToPosition()滚动到上一个位置。
  • 其次,稍等一下让布局管理员完成滚动。
  • 第三步,将项目添加到适配器数据集中。
  • 第四,现在拨打notifyItemInserted()scrollToPosition()

我有代码示例,但用编写,但它与的lambda表达式相同。如果您需要访问Adapter内的RecyclerView,您可能需要查看Adapter.onAttachedToRecyclerView()

if (Adapter.ListData.Count > 2) Adapter.RecyclerView.ScrollToPosition(Adapter.ListData.Count - 1);
Adapter.RecyclerView.PostDelayed(() =>
{
    Adapter.ListData.Add(new ItemSimplyfiedAdapter.Standard
    {
       //Some new item inserting into data set.
    });
    Adapter.NotifyItemInserted(Adapter.ListData.Count - 1);
    Adapter.RecyclerView?.ScrollToPosition(Adapter.ListData.Count - 1);
}, 100);