[英]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.