首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >LinearLayoutManager.findViewByPosition()返回null

LinearLayoutManager.findViewByPosition()返回null
EN

Stack Overflow用户
提问于 2017-09-20 15:54:37
回答 4查看 5.4K关注 0票数 2

我的活动是显示一个RecyclerView和一个LinearLayoutManager。我想得到列表中的第一项(View)。根据this post's accepted answer,我可以调用LinearLayoutManager.findViewByPosition()方法,但我得到的是null。为什么?

代码语言:javascript
运行
复制
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包含项,它不是空的。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-09-20 16:02:31

这是因为由RecyclerView组成的Adapter是异步的。当适配器完成填充RecyclerView以确保findViewByPosition返回给您时,您可以启动一个事件。

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

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

票数 2
EN

Stack Overflow用户

发布于 2019-12-29 22:43:48

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

代码语言:javascript
运行
复制
 rv.doOnPreDraw {
     // now it will work... 
     val view = llm.findViewByPosition(0)
   }
票数 5
EN

Stack Overflow用户

发布于 2017-09-20 16:03:06

尝尝这个。

代码语言:javascript
运行
复制
new Handler().postDelayed(new Runnable() {
     @Override
     public void run() {
         View firstViewItem = llm.findViewByPosition(0);
     }
 }, 500);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46326681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档