我正在开发AndroidTV应用。所以我有一个包含5个项目的水平线性布局的recyclerview。在OnBindViewHolder期间,我调用viewholder.bind(),在那里我动态地更改各个项的宽度。然后我调用getLocalVisibleRect()来查看哪些视图实际在屏幕上。这是问题所在。它适用于初始屏幕,但是当我向下滚动Recyclerview时,它与它们是否在屏幕上的结果不一致。这是我设置项目长度的地方,并尝试将其设置为可聚焦(如果它在屏幕上或不在屏幕上)。
PS C:\Users\Amir> $PSVersionTable.PSVersion
Major Minor Build Revision
----- ----- ----- --------
5 1 14393 0
我试图将GlobalLayoutListener更改为更改长度之前或之后,它似乎没有什么区别。因为它适用于初始的recyclerview项目,所以逻辑似乎有效。看起来它可能是一个竞争条件,但滚动一些项目时会给出正确的结果,而其余项目则非常不一致。例如,它会说屏幕上的视图不在屏幕上,屏幕外的视图在屏幕上。任何帮助将不胜感激。
答案 0 :(得分:1)
以下是您发布的<canvas id=c></canvas>
方法的替代方法。它使用isViewOnScreen()
的布局管理器来组合可见的视图,然后检查以确保所讨论的视图的适配器位置被这些位置括起来。请参阅doc for these methods。
RecyclerView
答案 1 :(得分:0)
我最后只是在使用了recyclerview的片段中检查OnKeyDown中屏幕上的哪些视图。这在计算方面有点过分,但对我的情况有效。这样可以确保在检查视图是否在屏幕上之前完全绘制视图。
private boolean setOnScreenViewsFocusable(View focus) {
View parentView = (View) focus.getParent();
if (parentView.getId() != View.NO_ID && parentView.getId() == R.id.channel_item) {
LinearLayout parentLayout = (LinearLayout) parentView;
for (int i = 1; i < 6; i++) {
parentLayout.getChildAt(i).setFocusable(isViewOnScreen(parentLayout.getChildAt(i)));
}
}
return false;
}
private boolean isViewOnScreen(View view) {
Rect r = new Rect();
return view.getGlobalVisibleRect(r);
}