LinearLayoutManager.findViewByPosition() 返回 null
LinearLayoutManager.findViewByPosition() is returning null
我的 Activity 显示 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
包含项目,它不是空的。
这是因为 RecyclerView
由 Adapter
填充是异步的。
您可以在适配器完成填充 RecyclerView 时启动一个事件,以确保 findViewByPosition
returns 对您有所帮助。
检测 RecyclerView 何时完成填充所有可见项目有点困难,因为我们应该计算每个项目的大小(宽度和高度)并定义在当前设备显示中可以进入多少项目。
但是如果您只需要访问第一个填充的项目,那么您可以在适配器的 onBindViewHolder
方法中触发您的事件,显然插入所需的控件以避免为每个添加的项目触发事件。
试试这个。
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
View firstViewItem = llm.findViewByPosition(0);
}
}, 500);
一个有用的函数是 doOnPreDraw - 您应该在 RecyclerView 上调用它并将您的代码放在那里。
rv.doOnPreDraw {
// now it will work...
val view = llm.findViewByPosition(0)
}
使用 OnGlobalLayoutListener
等待 RecyclerView
完成加载其项目:
myRecyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// do you stuff here...
}
});
我的 Activity 显示 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
包含项目,它不是空的。
这是因为 RecyclerView
由 Adapter
填充是异步的。
您可以在适配器完成填充 RecyclerView 时启动一个事件,以确保 findViewByPosition
returns 对您有所帮助。
检测 RecyclerView 何时完成填充所有可见项目有点困难,因为我们应该计算每个项目的大小(宽度和高度)并定义在当前设备显示中可以进入多少项目。
但是如果您只需要访问第一个填充的项目,那么您可以在适配器的 onBindViewHolder
方法中触发您的事件,显然插入所需的控件以避免为每个添加的项目触发事件。
试试这个。
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
View firstViewItem = llm.findViewByPosition(0);
}
}, 500);
一个有用的函数是 doOnPreDraw - 您应该在 RecyclerView 上调用它并将您的代码放在那里。
rv.doOnPreDraw {
// now it will work...
val view = llm.findViewByPosition(0)
}
使用 OnGlobalLayoutListener
等待 RecyclerView
完成加载其项目:
myRecyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// do you stuff here...
}
});