2016-02-02 23 views
5

Próbuję utworzyć aplikację Android TV podobną do aplikacji Youtube. i używam biblioteki Sofa, aby to zrobić. Teraz problem pojawia się, gdy próbuję wyświetlić nagłówki poszczególnych elementów w RowsFragment, nawet gdy RowsFragment nie ma fokusu. Poniżej znajduje się kod do ładowania zestawu danych do browseFragmentjak zawsze wyświetlać nagłówki w RowsFragment

private void loadRowsCustom() { 
     adapter = new ArrayObjectAdapter(); 

     int split = 3; 
     int rowsFragmentCount = videoList.size()/split + (videoList.size() % split != 0 ? 1 : 0); 

     for (int i = 0; i < rowsFragmentCount; i++) { 

      ListRowPresenter lrp = new ListRowPresenter(FocusHighlight.ZOOM_FACTOR_LARGE); 
      ArrayObjectAdapter rowsAdapter = new ArrayObjectAdapter(lrp); 

      String category = "Category"; 

      for (int j = 0; j < split && (i * split + j) < videoList.size(); j++) { 
       Video[] videos = videoList.get(i * split + j); 
       ArrayObjectAdapter rowCollAdapter = new ArrayObjectAdapter(new VideoPresenter()); 
       rowCollAdapter.addAll(0, Arrays.asList(videos)); 
       ListRow row = new ListRow(new HeaderItem(videos[0].category),rowCollAdapter); 
       rowsAdapter.add(row); 
       category = videos[0].category; 
      } 

      ArrayObjectAdapter fragmentAdapter = new ArrayObjectAdapter(); 
      RowsSupportFragment rowsSupportFragment = new RowsSupportFragment(); 
      rowsSupportFragment.setAdapter(rowsAdapter); 
      rowsSupportFragment.enableRowScaling(false); 
      fragmentAdapter.add(rowsSupportFragment); 
      adapter.add(new ListRow(new HeaderItem(category), fragmentAdapter)); 
     } 

     browseSupportFragment.setAdapter(adapter); 
     browseSupportFragment.setHeadersState(BrowseSupportFragment.HEADERS_ENABLED); 
     browseSupportFragment.setOnSearchClickedListener(searchClickListener); 
     browseSupportFragment.setOnItemViewClickedListener(browseClickListener); 
     browseSupportFragment.setTitle("Google Videos"); 
    } 

Wymagana i aktualna realizacja jest opisane jak w screeny poniżej:

enter image description here

enter image description here

Odpowiedz

1

Dla tych, którzy stoją w obliczu podobny problem, w końcu udało mi się znaleźć hack, który da pożądane rezultaty. Ale do tego może być konieczne pobranie źródła BrowseSupportFragment lub Sofa i zmodyfikowanie następującego wiersza kodu. Wiem, że to trochę hack, ale jest to pożądane wyjście.

Dla BrowseFragment: Notice the mRowsFragment.setExpand(true)

private void showHeaders(boolean show) { 
     if (DEBUG) Log.v(TAG, "showHeaders " + show); 
     mHeadersFragment.setHeadersEnabled(show); 
     setHeadersOnScreen(show); 
     setRowsAlignedLeft(!show); 
     if (mRowsFragment != null) { 
      mRowsFragment.setExpand(true); 
     } else if (mCurrentFragment != null && mCurrentFragment instanceof RowsFragment) { 
      ((RowsFragment) mCurrentFragment).setExpand(true); 
     } 
    } 

i samo dotyczy BrowseSupportFragment także

private void showHeaders(boolean show) { 
     if (DEBUG) Log.v(TAG, "showHeaders " + show); 
     mHeadersSupportFragment.setHeadersEnabled(show); 
     setHeadersOnScreen(show); 
     setRowsAlignedLeft(!show); 
     if (mRowsSupportFragment != null) { 
      mRowsSupportFragment.setExpand(true); 
     } else if (mCurrentFragment != null && mCurrentFragment instanceof RowsSupportFragment) { 
      ((RowsSupportFragment) mCurrentFragment).setExpand(true); 
     } 
    } 
+0

jak rozwiązali ten problem? proszę wyjaśnić, ponieważ chcę zrobić coś podobnego w mojej aplikacji telewizyjnej. –

+0

To nie działa w moim przypadku. Czy możesz umieścić swój kod na Github? –

2

Jak Mayur Kaul już wspomniano, u wystarczy zadzwonić

mRowsFragment.setExpand(true) 

ale w w tym przypadku za każdym razem, gdy metoda byłaby nazywać się (patrz android.support.v17.leanback.app.RowsFragment - ItemBridgeAdapter.AdapterListener mBridgeAdapterListener), twoje tytuły nagłówków i tak by były ukryte.

więc ostateczne rozwiązanie, czarownica pracował dla mnie to po prostu zastąpić setExpand() metody w implementacji RowsFragment jak poniżej:

@Override 
    public void setExpand(boolean expand) { 
     super.setExpand(true); 
    }