我想使用leanback库在Android TV中构建一个包含大量UI元素(1000s)的列表。我目前正在扩展VerticalGridFragment并使用ArrayObjectAdapter。我想从绑定(比方说)100个元素开始,然后在用户滚动到列表末尾时绑定接下来的100个元素。我没有看到实现此行为的方法。
VerticalGridFragment提供了两个侦听器:OnItemViewClickedListener和OnItemViewSelectedListener。在查询下一个100个元素之前,继续收听所选项目似乎非常昂贵。
有什么想法吗?感谢。
答案 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:
另一种方法依赖于VerticalGridView
由RecyclerView
支持的事实。您可以使用与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的方法。