android RecyclerView滚动到所需位置,无动画

rbl8hiat  于 2023-03-27  发布在  Android
关注(0)|答案(5)|浏览(379)

以前,当我想将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
  • 平滑滚动到位置
  • 滚动到位置
pbossiut

pbossiut1#

我知道我的回答有点晚了,但它可能会帮助其他人。尝试以下操作(至少我在使用它时看不到任何动画):

Kotlin:

//-- 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);
        }
});
gzszwxb4

gzszwxb42#

在layout.xml中添加此行

android:overScrollMode="never"

编辑:

滚动recycleview的另一种方式

recyclerView.smoothScrollToPosition(position);
yqlxgs2m

yqlxgs2m3#

您可以使用以下命令滚动而不显示动画:

recyclerView.scrollToPosition(position)
v8wbuo2f

v8wbuo2f4#

当您同时调用notifyItemInserted()scrollToPosition()时,可以很容易地重新生成。
动画是由RecyclerView默认项目animator类中的DefaultItemAnimator引起的。
我发现Youtube video是由其他人重新产生的问题。
我也有办法:

  • 首先,使用scrollToPosition()滚动到最后位置。
  • 第二,等待一点,让布局管理器完成滚动。
  • 第三,将item添加到适配器数据集中。
  • 第四,现在调用notifyItemInserted()scrollToPosition()

我有一个用c#编写的代码示例,但它用lambda表达式对

Kotlin做了同样的事情。如果你需要在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);
a7qyws3x

a7qyws3x5#

正如**@nyconing**在评论中所说,这种行为是由默认的ItemAnimator附加到回收器视图中引起的。只需删除它!

recyclerView.setItemAnimator(null);

相关问题