如何使用leanback库

时间:2016-06-20 22:40:49

标签: android-arrayadapter android-tv vertical-scroll

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

VerticalGridFragment提供了两个侦听器:OnItemViewClickedListener和OnItemViewSelectedListener。在查询下一个100个元素之前,继续收听所选项目似乎非常昂贵。

有什么想法吗?感谢。

1 个答案:

答案 0 :(得分:2)

我能想到两种方法。第一个是按照建议检查所选元素。这与我的回答类似to this SO post。监听器本身并不昂贵,只要你在监听器中进行轻量级检查,它就会对性能产生微不足道的影响。这种方法的缺点是,如果你在触摸屏设备上(运行斜背),你将无法选择滚动位置,因为单独滚动不会触发项目选择。

选项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:

另一种方法依赖于VerticalGridViewRecyclerView支持的事实。您可以使用与this class类似的内容。这将检查子元素的数量以及当前查看的元素。这会对性能产生更大的影响,因为它会更频繁地受到影响(但仍然是一个非常小的影响)。您可以通过向ScrollListener VerticalGridFragment VerticalGridView添加Presenter来实现此目标,而ko.validation.rules["atLeastOne"] = { validator: function(value, validate) { if (validate && Array.isArray(value)) { return !!value.length; } return true; }, message: "Please add at least one." }; 最有可能必须在function OpenQuestion() { var self = this; self.currentIndex = GetRandomIndex(); self.question = ko.observable().extend({ required: true, minLength: 1 }); } function QuestionViewModel() { var self = this; self.openQuestions = ko.observableArray().extend({ atLeastOne: { message: "Please add at least one." } }); self.addOpenQuestion = function () { self.openQuestions.push(new OpenQuestion()); } } 级别进行此操作。

结论:

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