簡體   English   中英

為什么 LinearLayoutManager.childAt() 返回 null?

[英]Why does LinearLayoutManager.childAt() returns null?

我有一個 recyclerview,其中在每次選擇項目時都會調用下面顯示的方法。 該方法僅在我不滾動recyclerview時成功運行,因此第一個可見為0。當我向下滾動並選擇第一個和最后一個可見的內容時,該方法已正確設置,但如屏幕截圖所示,由於我不明白的原因, childAt 返回 null 而不是我可以在我的應用程序屏幕上看到的視圖。 在位置 7 的屏幕截圖中,前 4-6 位返回了一個孩子。

有人可以向我解釋這是怎么發生的嗎? 從我的觀點來看, getChildAt() 在這種情況下應該總是返回一個視圖。

在此處輸入圖像描述

firstlast將是數據的適配器位置,而不是布局管理器中布置的位置。 請參閱LinearLayoutManager#findFirstVisibleItemPosition 孩子們總是從零開始,然后從那里增加。

這就是為什么它在滾動之前起作用的原因,因為布局管理器中第零索引處的子項也是適配器中的第零項。

是關於RecyclerView中各種位置的討論。

您似乎想要對所有可見項目進行更改。 您的firstlast變量將具有與屏幕上可見的內容相對應的正確開始/結束適配器位置。 您需要適配器位置來調用各種“通知”方法。

因此,給定適配器位置,我們需要一個映射到屏幕上顯示的視圖。 例如,以下代碼循環遍歷每個可見視圖並更改每個視圖的背景顏色。

LinearLayoutManager lm = (LinearLayoutManager) Recycler.getLayoutManager();
// Get adapter positions for first and last visible items on screen.
int firstVisible = lm.findFirstVisibleItemPosition();
int lastVisible = lm.findLastVisibleItemPosition();
for (int i = firstVisible; i <= lastVisible; i++) {
    // Find the view that corresponds to this position in the adapter.
    View visibleView = lm.findViewByPosition(i);
    visibleView.setBackgroundColor(getResources().getColor(android.R.color.holo_red_light));
}

如果您使用布局管理器的子方法,則需要從零循環到LayoutManager.getChildCount() - 1進行更改。 您將看到每個附加視圖,我相信這些視圖可以超過可見視圖的數量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM