LinearLayoutManager.findViewByPosition()返回null

时间:2017-09-20 15:54:38

标签: android android-recyclerview linearlayoutmanager

我的活动正在显示RecyclerView LinearLayoutManager。我想获得列表中的第一项(View)。根据{{​​3}},我可以调用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包含项目,它不是空的。

4 个答案:

答案 0 :(得分:2)

这是因为RecyclerView Adapter的人口是异步的。 您可以在适配器完成时启动事件以填充RecyclerView,以确保findViewByPosition向您返回内容。

检测RecyclerView何时完成填充所有可见项目有点困难,因为我们应该计算每个项目大小(宽度和高度)并定义当前设备显示中可以输入的项目数。

但是,如果你需要的只是访问第一个填充的项目,那么你可以在你的适配器onBindViewHolder方法中激活你的事件,显然插入所需的控件以避免为每个添加的项目触发事件。

答案 1 :(得分:1)

试试这个。

new Handler().postDelayed(new Runnable() {
     @Override
     public void run() {
         View firstViewItem = llm.findViewByPosition(0);
     }
 }, 500);

答案 2 :(得分:0)

一个有用的函数是doOnPreDraw-您应该在RecyclerView上调用它并将代码放在此处。

 rv.doOnPreDraw {
     // now it will work... 
     val view = llm.findViewByPosition(0)
   }

答案 3 :(得分:0)

使用 OnGlobalLayoutListener 等待 RecyclerView 完成加载其项目:

myRecyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                    @Override
                    public void onGlobalLayout() {
                        // do you stuff here...
                    }
                });