如何使用 leanback 库在 android TV 中高效地实现大型单个列表

How to implement a large single list efficiently in android TV using leanback library

我想使用 leanback 库在 Android TV 中构建一个包含大量 UI 元素(1000 多个)的列表。我目前正在扩展 VerticalGridFragment 并使用 ArrayObjectAdapter。我想从绑定(比如)100 个元素开始,然后在用户滚动到列表末尾时绑定接下来的 100 个元素。我看不到实现此行为的方法。

VerticalGridFragment 提供了两个监听器:OnItemViewClickedListener 和OnItemViewSelectedListener。在查询接下来的 100 个元素之前继续监听每个被选中的项目似乎非常昂贵。

有什么想法吗?谢谢

我能想到两种方法。首先是按照您的建议检查所选元素。这类似于我的回答。侦听器本身并不昂贵,只要您在侦听器中进行轻量级检查,那么它对性能的影响就可以忽略不计。这种方法的缺点是,如果您使用的是触摸屏设备 (运行 leanback),您将无法选择滚动位置,因为单独滚动不会触发项目选择。

选项 1:

final int FETCH_NEXT_THRESHOLD = 5; // or NUM_COLUMNS * 2 if it's a grid
final ListRow listRow = (ListRow) row;
final ArrayObjectAdapter currentRowAdapter = listRow.getAdapter();
int selectedIndex = currentRowAdapter.indexOf(item);
if (selectedIndex != -1 && (currentRowAdapter.size() - index < FETCH_NEXT_THRESHOLD) {
    // One of the last FETCH_NEXT_THRESHOLD items was selected.
    // Trigger next page fetch now.
}

选项 2:

另一种方法依赖于 VerticalGridView 得到 RecyclerView 支持这一事实。您可以使用类似于 this class 的内容。这将检查子元素的数量以及当前在视图中的元素。这对性能有更大的影响,因为它更频繁地受到攻击(但仍然是非常小的影响)。您可以通过向 VerticalGridFragmentVerticalGridView 添加 ScrollListener 来实现此目的,您很可能必须在 Presenter 级别上这样做。

结论:

我会建议选项 1,因为它更容易实施并且适用于大多数用例。但是,如果您担心触摸屏设备 运行 leanback,您可能希望采用类似于选项 2 的方法。