![](/img/trans.png)
[英]why findviewbyposition( ) of recyclerView returns null only sometimes
[英]LinearLayoutManager.findViewByPosition() is returning null
我的 Activity 顯示了一個帶有LinearLayoutManager
的RecyclerView
。 我想獲取列表中的第一項( View
)。 根據這篇文章接受的答案,我可以調用LinearLayoutManager.findViewByPosition()
方法,但我得到的是null
。 為什么?
RecyclerView list = findViewById(R.id.list);
LinearLayoutManager llm = new LinearLayoutManager(this);
list.setLayoutManager(llm);
MyAdapter adapter = new MyAdapter();
list.setAdapter(adapter);
View firstViewItem = llm.findViewByPosition(0); // <-- null
adapter
包含項目,它不是空的。
一個有用的函數是 doOnPreDraw - 你應該在 RecyclerView 上調用它並將你的代碼放在那里。
rv.doOnPreDraw {
// now it will work...
val view = llm.findViewByPosition(0)
}
這是因為Adapter
對RecyclerView
的填充是異步的。 您可以在適配器完成填充 RecyclerView 時啟動一個事件,以確保findViewByPosition
向您返回某些內容。
檢測 RecyclerView 何時完成填充所有可見項有點困難,因為我們應該計算每個項的大小(寬度和高度)並定義當前設備顯示中可以輸入的項數。
但是,如果您只需要訪問第一個填充的項目,那么您可以在適配器的onBindViewHolder
方法中觸發您的事件,顯然插入所需的控件以避免為每個添加的項目觸發事件。
試試這個。
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
View firstViewItem = llm.findViewByPosition(0);
}
}, 500);
使用OnGlobalLayoutListener
等待RecyclerView
完成加載其項目:
myRecyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// do you stuff here...
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.