查看回收站视图中的视图是否在屏幕上

时间:2018-03-15 17:21:47

标签: android android-recyclerview android-tv

我正在开发AndroidTV应用。所以我有一个包含5个项目的水平线性布局的recyclerview。在OnBindViewHolder期间,我调用viewholder.bind(),在那里我动态地更改各个项的宽度。然后我调用getLocalVisibleRect()来查看哪些视图实际在屏幕上。这是问题所在。它适用于初始屏幕,但是当我向下滚动Recyclerview时,它与它们是否在屏幕上的结果不一致。这是我设置项目长度的地方,并尝试将其设置为可聚焦(如果它在屏幕上或不在屏幕上)。

PS C:\Users\Amir> $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      14393  0

我试图将GlobalLayoutListener更改为更改长度之前或之后,它似乎没有什么区别。因为它适用于初始的recyclerview项目,所以逻辑似乎有效。看起来它可能是一个竞争条件,但滚动一些项目时会给出正确的结果,而其余项目则非常不一致。例如,它会说屏幕上的视图不在屏幕上,屏幕外的视图在屏幕上。任何帮助将不胜感激。

2 个答案:

答案 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);
}