簡體   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