Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android – 将RecyclerView项目插入零位 – 始终保持滚动到顶部大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

我有一个非常标准的RecyclerView与垂直linearlayoutmanager.我一直在顶部插入新项目,我正在调用notifyItemInserted(0).

我希望列表保持滚动到顶部;始终显示第0个位置.

从我的要求来看,LayoutManager根据项目的数量表现不同.

然所有项目都适合屏幕,但它的外观和行为与我预期的一样:新项目始终显示在顶部,并将所有项目移到它下面.

android  – 将RecyclerView项目插入零位 – 始终保持滚动到顶部

但是,一旦没有.项目超出RecyclerView的范围,新项目将添加到当前可见项目之上,但可见项目仍保留在视图中.用户必须滚动才能看到最新的项目.

android  – 将RecyclerView项目插入零位 – 始终保持滚动到顶部

对于许多应用程序来说,这种行为是完全可以理解的,但不适用于“实时馈送”,其中看到最近的事情比使用自动滚动“不分散”用户更重要.

我知道这个问题几乎与Adding new item to the top of the RecyclerView重复……但所有提出的答案都只是解决方法(大多数问题都很好,不可否认).

我正在寻找一种方法来实际改变这种行为.我希望LayoutManager的行为完全相同,无论项目数量多少.我希望它总是移动所有项目(就像它为前几个添加项目所做的那样),而不是停止在某些时候移动项目,并通过平滑滚动列表到顶部进行补偿.

基本上,没有smoothScrollToPosition,没有RecyclerView.SmoothScroller.子类化linearlayoutmanager很好.我已经挖掘了它的代码,但到目前为止没有任何运气,所以我决定询问以防有人已经处理过这个问题.谢谢你的任何想法!

编辑:澄清为什么我从相关问题中驳回答案:主要是我关注动画的平滑性.

请注意,在第一个GIF中,ItemAnimator在添加新项目的同时移动其他项目,淡入和移动动画都具有相同的持续时间.但是当我通过平滑滚动“移动”项目时,我无法轻易控制滚动的速度.即使使用认的ItemAnimator持续时间,这看起来也不太好,但在我的特定情况下,我甚至需要减慢ItemAnimator持续时间,这会使情况变得更糟:

android  – 将RecyclerView项目插入零位 – 始终保持滚动到顶部

最佳答案
当项目添加到RecyclerView的顶部并且项目可以适合屏幕时,项目将附加到视图持有者,RecyclerView将经历动画阶段以向下移动项目以在顶部显示新项目.

如果在没有滚动的情况下无法显示新项目,则不会创建视图持有者,因此没有任何动画效果.当发生这种情况时,将新项目放到屏幕上的唯一方法是滚动,这会导致创建视图持有者,以便可以在屏幕上显示视图. (似乎有一个边缘情况,部分显示视图并创建视图持有者,但我将忽略此特定实例,因为它不是密切关系.)

因此,问题在于必须使用两个不同的动作,添加视图的动画和添加视图的滚动,以使其看起来相同.我们可以深入了解底层代码,并确定在视图持有者创建,动画计时等方面究竟发生了什么.但是,即使我们可以复制操作,如果底层代码发生更改,它也可能会中断.这就是你所抵制的.

另一种方法是在RecyclerView的零位添加标题.当显示标题并将新项目添加到位置1时,您将始终看到动画.如果您不想要标题,则可以将其设置为零高度并且不会显示.以下视频显示了这种技术:

android  – 将RecyclerView项目插入零位 – 始终保持滚动到顶部

这是演示的代码.它只是在项目的第0位添加一个虚拟条目.如果虚拟条目不符合您的喜好,还有其他方法可以解决这个问题.您可以搜索向RecyclerView添加标头的方法.

(如果你确实使用了滚动条,那么你可能会从演示中看出它会出错.要修复这个100%,你必须接管很多滚动条高度和位置计算.LineLayoutManager的自定义computeVerticalScrollOffset()在适当的时候将滚动条放在顶部.(在视频拍摄后引入了代码.)但是滚动条在向下滚动时会跳转.更好的放置计算可以解决这个问题.有关滚动条的更多信息,请参阅this Stack Overflow question不同高度项目的背景.)

@H_839_1@mainActivity.java

public class MainActivity extends AppCompatActivity implements View.onClickListener {
    private TheAdapter mAdapter;
    private final ArrayList<>(); private="" int="" mitemcount="0;" @override="" protected="" void="" oncreate(bundle="" savedinstancestate)="" {="" super.oncreate(savedinstancestate);="" setcontentview(r.layout.activity_main);="" recyclerview="" recyclerview="(RecyclerView)" findviewbyid(r.id.recyclerview);="">linearlayoutmanager layoutManager =
        new linearlayoutmanager(this,linearlayoutmanager.VERTICAL,falsE) {
            @Override
            public int computeVerticalScrollOffset(RecyclerView.State statE) {
                if (findFirstCompletelyVisibleItemPosition() == 0) {
                    // Force scrollbar to top of range. When scrolling down,the scrollbar
                    // will jump since RecyclerView seems to assume the same height for
                    // all items.
                    return 0;
                } else {
                    return super.computeVerticalScrollOffset(statE);
                }
            }
        };
        recyclerView.setLayoutManager(layoutManager);

        for (mItemCount = 0; mItemCount < 6;="" mitemcount++)="" {="" mitems.add(0,"item="" #="" "="" +="" mitemcount);="" }="" create="" a="" dummy="" entry="" that="" is="" just="" a="" placeholder.="" mitems.add(0,"dummy="" item="" that="" won't="" display");="" madapter="new" theadapter(mitems);="" recyclerview.setadapter(madapter);="" }="" @override="" public="" void="" onclick(view="" view)="" {="" always="" at="" to="" position="" #1="" to="" let="" animation="" occur.="" mitems.add(1,"item="" #="" "="" +="" mitemcount++);="" madapter.notifyiteminserted(1);="" }="" }="">

TheAdapter.java

class TheAdapter extends RecyclerView.Adapter

activity_main.xml中

list_item.xml

Box"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_marginStart="16dp"
        android:BACkground="@android:color/holo_green_light"
        app:layout_consTraintBottom_toBottomOf="parent"
        app:layout_consTraintStart_toStartOf="parent"
        app:layout_consTraintTop_toTopOf="parent" />

    Traintbottom_tobottomof="parent" app:layout_consTraintstart_toendof="@id/Box"
        app:layout_consTraintTop_toTopOf="parent"
        tools:text="TextView" />

大佬总结

以上是大佬教程为你收集整理的android – 将RecyclerView项目插入零位 – 始终保持滚动到顶部全部内容,希望文章能够帮你解决android – 将RecyclerView项目插入零位 – 始终保持滚动到顶部所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。