2

我的活动显示RecyclerView带有LinearLayoutManager. 我想获得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包含项目,它不为空。

4

4 回答 4

5

一个有用的函数是 doOnPreDraw - 你应该在 RecyclerView 上调用它并将你的代码放在那里。

 rv.doOnPreDraw {
     // now it will work... 
     val view = llm.findViewByPosition(0)
   }
于 2019-12-29T22:43:48.393 回答
2

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

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

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

于 2017-09-20T16:02:31.243 回答
1

尝试这个。

new Handler().postDelayed(new Runnable() {
     @Override
     public void run() {
         View firstViewItem = llm.findViewByPosition(0);
     }
 }, 500);
于 2017-09-20T16:03:06.347 回答
0

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

myRecyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                    @Override
                    public void onGlobalLayout() {
                        // do you stuff here...
                    }
                });
于 2021-08-07T20:56:39.853 回答