99import android .os .SystemClock ;
1010import android .support .v17 .leanback .app .BrowseFragment ;
1111import android .support .v17 .leanback .widget .ArrayObjectAdapter ;
12- import android .support .v17 .leanback .widget .HeaderItem ;
1312import android .support .v17 .leanback .widget .ListRow ;
1413import android .support .v17 .leanback .widget .ListRowPresenter ;
1514import android .support .v17 .leanback .widget .OnItemViewClickedListener ;
1615import android .support .v17 .leanback .widget .OnItemViewSelectedListener ;
1716import android .support .v17 .leanback .widget .Presenter ;
17+ import android .support .v17 .leanback .widget .PresenterSelector ;
1818import android .support .v17 .leanback .widget .Row ;
1919import android .support .v17 .leanback .widget .RowPresenter ;
2020import android .support .v4 .app .NotificationCompat ;
2727
2828import com .corochann .androidtvapptutorial .R ;
2929import com .corochann .androidtvapptutorial .data .VideoItemLoader ;
30+ import com .corochann .androidtvapptutorial .model .IconHeaderItem ;
3031import com .corochann .androidtvapptutorial .model .Movie ;
3132import com .corochann .androidtvapptutorial .recommendation .RecommendationFactory ;
3233import com .corochann .androidtvapptutorial .ui .background .PicassoBackgroundManager ;
3334import com .corochann .androidtvapptutorial .ui .presenter .CardPresenter ;
35+ import com .corochann .androidtvapptutorial .ui .presenter .IconHeaderItemPresenter ;
3436
3537import java .util .ArrayList ;
3638import java .util .LinkedHashMap ;
4345public class MainFragment extends BrowseFragment {
4446 private static final String TAG = MainFragment .class .getSimpleName ();
4547
48+ /* Adapter and ListRows */
4649 private ArrayObjectAdapter mRowsAdapter ;
50+ private ListRow mGridItemListRow ;
51+ ArrayList <ListRow > mVideoListRowArray ;
4752
4853 /* Grid row item settings */
4954 private static final int GRID_ITEM_WIDTH = 300 ;
@@ -67,16 +72,18 @@ public void onActivityCreated(Bundle savedInstanceState) {
6772
6873 setupUIElements ();
6974
75+ /* Set up rows with light data. done in main thread. */
7076 loadRows ();
77+ setRows ();
78+
79+ /* Set up rows with heavy data (data from web, content provider etc) is done in background thread using Loader */
7180 LoaderManager .enableDebugLogging (true );
7281 getLoaderManager ().initLoader (VIDEO_ITEM_LOADER_ID , null , new MainFragmentLoaderCallbacks ());
7382
74-
7583 setupEventListeners ();
7684
7785 picassoBackgroundManager = new PicassoBackgroundManager (getActivity ());
7886 picassoBackgroundManager .updateBackgroundWithDelay ();
79- //picassoBackgroundManager.updateBackgroundWithDelay("http://heimkehrend.raindrop.jp/kl-hacker/wp-content/uploads/2014/10/RIMG0656.jpg");
8087 }
8188
8289 private void setupEventListeners () {
@@ -155,39 +162,50 @@ private void setupUIElements() {
155162 setBrandColor (getResources ().getColor (R .color .fastlane_background ));
156163 // set search icon color
157164 setSearchAffordanceColor (getResources ().getColor (R .color .search_opaque ));
158- }
159-
160165
166+ setHeaderPresenterSelector (new PresenterSelector () {
167+ @ Override
168+ public Presenter getPresenter (Object o ) {
169+ return new IconHeaderItemPresenter ();
170+ }
171+ });
172+ }
161173
174+ /**
175+ * only load rows which can be prepared (executed in main thread) instantaneously.
176+ * UI update is done in {@link #setRows}
177+ */
162178 private void loadRows () {
163- mRowsAdapter = new ArrayObjectAdapter (new ListRowPresenter ());
164-
165179 /* GridItemPresenter */
166- HeaderItem gridItemPresenterHeader = new HeaderItem (0 , "GridItemPresenter" );
180+ IconHeaderItem gridItemPresenterHeader = new IconHeaderItem (0 , "GridItemPresenter" , R . drawable . ic_add_white_48dp );
167181
168182 GridItemPresenter mGridPresenter = new GridItemPresenter ();
169183 ArrayObjectAdapter gridRowAdapter = new ArrayObjectAdapter (mGridPresenter );
170184 gridRowAdapter .add (GRID_STRING_ERROR_FRAGMENT );
171185 gridRowAdapter .add (GRID_STRING_GUIDED_STEP_FRAGMENT );
172186 gridRowAdapter .add (GRID_STRING_RECOMMENDATION );
173187 gridRowAdapter .add (GRID_STRING_SPINNER );
174- mRowsAdapter .add (new ListRow (gridItemPresenterHeader , gridRowAdapter ));
188+ mGridItemListRow = new ListRow (gridItemPresenterHeader , gridRowAdapter );
189+ }
175190
176- /* CardPresenter */
177- /*
178- HeaderItem cardPresenterHeader = new HeaderItem(1, "CardPresenter");
179- CardPresenter cardPresenter = new CardPresenter();
180- ArrayObjectAdapter cardRowAdapter = new ArrayObjectAdapter(cardPresenter);
191+ /**
192+ * Updates UI after loading Row done.
193+ */
194+ private void setRows () {
195+ mRowsAdapter = new ArrayObjectAdapter (new ListRowPresenter ()); // Initialize
181196
182- for (Movie movie : mItems) {
183- cardRowAdapter.add(movie);
197+ if (mVideoListRowArray != null ) {
198+ for (ListRow videoListRow : mVideoListRowArray ) {
199+ mRowsAdapter .add (videoListRow );
200+ }
201+ }
202+ if (mGridItemListRow != null ) {
203+ mRowsAdapter .add (mGridItemListRow );
184204 }
185-
186- mRowsAdapter.add(new ListRow(cardPresenterHeader, cardRowAdapter));
187- */
188205
189206 /* Set */
190207 setAdapter (mRowsAdapter );
208+
191209 }
192210
193211 private class MainFragmentLoaderCallbacks implements LoaderManager .LoaderCallbacks <LinkedHashMap <String , List <Movie >>> {
@@ -214,22 +232,9 @@ public void onLoadFinished(Loader<LinkedHashMap<String, List<Movie>>> loader, Li
214232 /* Hold data reference to use it for recommendation */
215233 mItems = new ArrayList <Movie >();
216234
217- mRowsAdapter = new ArrayObjectAdapter (new ListRowPresenter ());
218-
219- int index = 0 ;
220- /* GridItemPresenter */
221- HeaderItem gridItemPresenterHeader = new HeaderItem (index , "GridItemPresenter" );
222- index ++;
223-
224- GridItemPresenter mGridPresenter = new GridItemPresenter ();
225- ArrayObjectAdapter gridRowAdapter = new ArrayObjectAdapter (mGridPresenter );
226- gridRowAdapter .add (GRID_STRING_ERROR_FRAGMENT );
227- gridRowAdapter .add (GRID_STRING_GUIDED_STEP_FRAGMENT );
228- gridRowAdapter .add (GRID_STRING_RECOMMENDATION );
229- gridRowAdapter .add (GRID_STRING_SPINNER );
230- mRowsAdapter .add (new ListRow (gridItemPresenterHeader , gridRowAdapter ));
231-
232- /* CardPresenter */
235+ /* loadRows: videoListRow - CardPresenter */
236+ int index = 1 ;
237+ mVideoListRowArray = new ArrayList <>();
233238 CardPresenter cardPresenter = new CardPresenter ();
234239
235240 if (null != data ) {
@@ -242,15 +247,16 @@ public void onLoadFinished(Loader<LinkedHashMap<String, List<Movie>>> loader, Li
242247 cardRowAdapter .add (movie );
243248 mItems .add (movie ); // Add movie reference for recommendation purpose.
244249 }
245- HeaderItem header = new HeaderItem (index , entry .getKey ());
250+ IconHeaderItem header = new IconHeaderItem (index , entry .getKey (), R . drawable . ic_play_arrow_white_48dp );
246251 index ++;
247- mRowsAdapter .add (new ListRow (header , cardRowAdapter ));
252+ mVideoListRowArray .add (new ListRow (header , cardRowAdapter ));
248253 }
249254 } else {
250255 Log .e (TAG , "An error occurred fetching videos" );
251256 }
257+
252258 /* Set */
253- setAdapter ( mRowsAdapter );
259+ setRows ( );
254260 }
255261 }
256262
0 commit comments