paint-brush
How to refresh the Android Tv BrowseFragment ?by@be.betr.codr
2,340 reads
2,340 reads

How to refresh the Android Tv BrowseFragment ?

by Wilfried Mbouenda MbogneJuly 21st, 2016
Read on Terminal Reader
Read this story w/o Javascript
tldt arrow

Too Long; Didn't Read

During my work I faced a serious problem: <strong>flash effect when refreshing items of the </strong><a href="https://developer.android.com/reference/android/support/v17/leanback/app/BrowseFragment.html" target="_blank"><strong>BrowseFragment</strong></a><strong>’s rows</strong>.
featured image - How to refresh the Android Tv BrowseFragment ?
Wilfried Mbouenda Mbogne HackerNoon profile picture

During my work I faced a serious problem: flash effect when refreshing items of the BrowseFragment’s rows.

source: https://developer.android.com/training/tv/playback/browse.html

Introduction

Before talking about the solution of the problem, Let’s introduce the BrowseFragment. The BrowseFragment is a fragment for creating media catalog. In the media catalog, we can browse categories from the left, and select contents of the selected category on the right. The media catalog is composed of a RowsFragment and a HeadersFragment. A BrowseFragment renders the elements of its ObjectAdapter as a set of rows in a vertical list.

media catalog


Now let’s imagine we want to refresh every 5 seconds the data of the RowsFragment with a background task.How can we do that ?

First solution: just update the adapter





The BrowseFragment use an ArrayObjectAdapter to display data. We just need to:1. clear the items of the adapter (clear)2. add new items to the adapter(addAll)  Problem: the flash effect

Every time there is a refresh, the fragment blinks. The flash effect is caused by the adapter notifying the UI for each operation on the items. As we can see the method clear() and addAll() have a notify method of ArrayObjectAdapter have a notify method:








public void clear() {int itemCount = mItems.size();if (itemCount == 0) {return;}mItems.clear();notifyItemRangeRemoved(0, itemCount); //notifies UI}








public void addAll(int index, Collection items) {int itemsCount = items.size();if (itemsCount == 0) {return;}mItems.addAll(index, items);notifyItemRangeInserted(index, itemsCount);//notifies UI}

Second solution: your own adapter:

we can create our own adapter and choose when and how to notify the changes on the items.

I created a custom ObjectAdapter with a new replaceAll() method.









public void replaceAll(Collection items){int itemsCount = items.size();if (itemsCount == 0){return;}** mItems.clear();mItems.addAll(index, items);notifyItemRangeChanged(0, itemsCount);**}

Show me the code

The full class is here:

References:


Creating a Catalog Browser | Android Developers_A media app that runs on a TV needs to allow users to browse its content offerings, make a selection, and start playing…_developer.android.com

N E X T → Documenting My Android Adventure

Before you go… If you enjoyed this post, you will love to subscribe to my newsletter. Get my cheat sheet: “Android Studio keyboard shortcuts cheat sheet”.