繁体   English   中英

如果RecyclerView太短,则Android LinearLayoutManager scrollToPositionWithOffset无法正常工作

[英]android LinearLayoutManager scrollToPositionWithOffset not work if RecyclerView is too short

问题描述

如果RecyclerView的所有子项的高度之和大于屏幕高度LinearLayoutManager.scrollToPositionWithOffset(pos, 0)效果很好。 但是,如果RecyclerView的所有子项的高度之和小于屏幕高度,那将不起作用。

问题详细描述

假设我有一个Activity和一个RecyclerView作为其根视图。 RecyclerViewwidthheight均为match_parent RecyclerView有3个项目,这3个子视图的高度之和小于屏幕高度。 我想在ActivityonCreated时隐藏第一项。 用户将在开始时看到第二项。 如果用户向下滚动,他仍然可以看到第一项。 所以我叫LinearLayoutManager.scrollToPositionWithOffset(1, 0) 但是,由于RecyclerView的所有子项的高度之和小于屏幕高度,所以它不起作用。

即使RecyclerView的所有子项的高度之和小于屏幕高度,如何使RecyclerView滚动到特定位置。


以下是根据@Haran Sivaram的回答我的代码:

Item first = new Item();
Item second = new Item();
Item third = new Item();
List<Item> list = Arrays.asList(first, second, three);

adapter.add(list);
adapter.notifyDataSetChanged();

recyclerView.post(new Runnable() {
            @Override
            public void run() {
                int sumHeight = 0;
                for (int i = 0; i < recyclerView.getChildCount(); i++) {
                    View view = recyclerView.getChildAt(i);
                    sumHeight += view.getHeight();
                }
                if (sumHeight < recyclerView.getHeight()) {
                    adapter.addItem(new VerticalSpaceViewModel(recyclerView.getHeight() - sumHeight + recyclerView.getChildAt(0).getHeight()));
                }
                linearLayoutManager.scrollToPositionWithOffset(1, 0);
            }
        });

有效。 但是有一些小问题。

您需要做的是将回收器视图的minimum height增加到minimum height ,这将允许滚动并隐藏您的第一个元素(screen height + height of the first item) 您可以通过添加一个虚拟元素作为最后一个元素并设置其高度来实现此目的,或者也可以使用padding / margins来做到这一点(尚未尝试过)。

绘制视图后,还必须动态完成此操作(如果您事先知道每个项目的大小,则可以静态地进行操作-不过,我不建议您使用此方法)。

绘制视图后,请使用onGLobalLayoutListner获取callback ,在此处进行测量并更新高度。 现在,具有偏移量的滚动应该可以正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM