Android TV:如何通知 Card Presenter 项目更改

Posted

技术标签:

【中文标题】Android TV:如何通知 Card Presenter 项目更改【英文标题】:Android TV: How to notify Card Presenter items change 【发布时间】:2018-02-27 23:52:08 【问题描述】:

所以,我正在使用 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 访问。我应该如何重新加载该数据而不导致屏幕每隔几秒闪烁一次?

【问题讨论】:

【参考方案1】:
mRowAdapter.notifyArrayItemRangeChanged(startingIndex, mRowAdapter.size());

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

【讨论】:

谢谢,但问题是,屏幕每隔几秒闪烁一次,看起来不太好:/ 就是这样..当您调用为每个项目更改的范围时,您会看到屏幕闪烁..所以在给出起始索引时指定可见数据后的位置 +1 哦..是的,我将 index 设置为 0。但是由于这个 ArrayObjectAdapter 没有提供任何获取位置的方法,我如何才能获得位置? 我说的是行位置。例如,如果您通过获取数据来更新第一行,则全局维护一个计数器...并保持值更新..将该值用于startingindex..希望它有效 但是如果我想更新整个列表呢?起始索引应该是 0,对吧?【参考方案2】:

也许这个答案会有所帮助

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 -Reloading adapter data

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

【讨论】:

【参考方案3】:
notifyArrayItemRangeChanged

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

class RefreshableArrayObjectAdapter(presenterSelector: PresenterSelector) :
    ArrayObjectAdapter(presenterSelector) 
    fun refresh() 
        notifyChanged()
    

【讨论】:

以上是关于Android TV:如何通知 Card Presenter 项目更改的主要内容,如果未能解决你的问题,请参考以下文章

通知不会出现在 Android TV 上

Android TV 应用程序的持续状态? (在Android上用啥代替通知栏)

没有为android.media.tv.action.INITIALIZE_PROGRAMS发送BroadcastReceiver通知

Android TV 上的 GCM

圆角矩形

Android TV:如何使用 Leanbak 自定义 android TV 的左侧导航面板?