簡體   English   中英

LinearLayoutManager.findViewByPosition() 返回 null

[英]LinearLayoutManager.findViewByPosition() is returning null

我的 Activity 顯示了一個帶有LinearLayoutManagerRecyclerView 我想獲取列表中的第一項( 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)
   }

這是因為AdapterRecyclerView的填充是異步的。 您可以在適配器完成填充 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.

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