-2

所以,我正在用 Leanback 的 Browse Fragment 和 CardPresenter 制作一个屏幕。

在我扩展 BrowseFragment 的片段中,我有一个绘制 UI 的方法:

    private void loadCardRows() {
    mRowsAdapter = new CustomArrayObjectAdapter(new ListRowPresenter());

    final List<UiType> uiTypeList = new ArrayList<>(uiTypes);

    for (UiType uiType : uiTypeList) {
        HeaderItem cardPresenterHeader = new HeaderItem(0, uiType.getName());
        List<TypeReportItem> items = performUiTypeFiltering(uiType.getEndpointType());
        CardPresenter cardPresenter = new CardPresenter(attributesHelper);
        CustomArrayObjectAdapter cardRowAdapter = new CustomArrayObjectAdapter(cardPresenter);

        for (TypeReportItem item : items) {
            cardRowAdapter.add(item);
        }

        mRowsAdapter.add(new ListRow(cardPresenterHeader, cardRowAdapter));

    }
    setAdapter(mRowsAdapter);
}

现在我有一个每隔几秒钟加载一些数据的服务。可以通过我传递给 CardPresenter 的 attributesHelper 访问该数据。我应该如何重新加载该数据而不导致屏幕每隔几秒钟闪烁一次?

4

3 回答 3

3
mRowAdapter.notifyArrayItemRangeChanged(startingIndex, mRowAdapter.size());

起始索引是您更新数据的位置。不要给起始索引像 0,这将导致屏幕从索引 0 闪烁

于 2017-09-19T09:20:10.133 回答
0

也许这个anwser会有所帮助

for (int i = 0; i < mAdapter.size(); i++) {
ListRow listRow = ((ListRow) mAdapter.get(i));
ArrayObjectAdapter listRowAdapter = ((ArrayObjectAdapter) listRow.getAdapter());
if (listRowAdapter.size() > 0) {
    listRowAdapter.notifyArrayItemRangeChanged(0, listRowAdapter.size());
}
}

android tv - 重新加载适配器数据

我在我的项目中使用了这个代码。没有眨眼。

于 2017-12-25T04:14:03.127 回答
0
notifyArrayItemRangeChanged

导致闪烁,所以试试这个适配器

class RefreshableArrayObjectAdapter(presenterSelector: PresenterSelector) :
    ArrayObjectAdapter(presenterSelector) {
    fun refresh() {
        notifyChanged()
    }
}
于 2021-01-28T09:19:33.773 回答