Android TV: How to notify Card Presenter items change

2.1k Views Asked by At

So, I'm making a screen with Leanback's Browse Fragment and CardPresenter.

Inside my fragment that extends BrowseFragment, I have a method for drawing the 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);
}

Now I'm having a service that loads some data every few seconds. That data is reachable through attributesHelper that I'm passing to CardPresenter.. How am I supposed to reload that data without causing the screen to blink every few seconds?

3

There are 3 best solutions below

7
Sharath kumar On
mRowAdapter.notifyArrayItemRangeChanged(startingIndex, mRowAdapter.size());

Starting index is the one from which position your are updating data.Dont give starting index something like 0,which will result in screen blink from index 0

0
Tracyliu On

Maybe this anwser will be helpful

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

I have used this code in my project. No blink happened.

0
Danylo.Vus On
notifyArrayItemRangeChanged

caused blinking, so try this Adapter

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