[英]scrollToPositionWithOffset from LinearLayoutManager on RecyclerView not working
[英]android LinearLayoutManager scrollToPositionWithOffset not work if RecyclerView is too short
如果RecyclerView
的所有子项的高度之和大于屏幕高度LinearLayoutManager.scrollToPositionWithOffset(pos, 0)
效果很好。 但是,如果RecyclerView
的所有子项的高度之和小于屏幕高度,那将不起作用。
假设我有一个Activity
和一个RecyclerView
作为其根视图。 RecyclerView
的width
和height
均为match_parent
。 此RecyclerView
有3个项目,这3个子视图的高度之和小于屏幕高度。 我想在Activity
为onCreated
时隐藏第一项。 用户将在开始时看到第二项。 如果用户向下滚动,他仍然可以看到第一项。 所以我叫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.