5

Używam domyślnego projektu dla Android TV. Poniżej znajduje się kod do tworzenia kart w moim BrowseFragment:Jak korzystać z setRowViewSelected z ListRowPresenter

private void loadRows() { 
    List<Movie> list = MovieList.setupMovies(); 
    ListRowPresenter mListRowPresenter = new ListRowPresenter(); 
    mRowsAdapter = new ArrayObjectAdapter(mListRowPresenter); 

    mListRowPresenter.setRowViewSelected(/*HOW TO GET VIEWHOLDER HERE?*/, false); 

    CardPresenter cardPresenter = new CardPresenter(); 

    int i; 
    for (i = 0; i < NUM_ROWS; i++) { 
     if (i != 0) { 
      Collections.shuffle(list); 
     } 
     ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(cardPresenter); 
     for (int j = 0; j < NUM_COLS; j++) { 
      listRowAdapter.add(list.get(j % 5)); 
     } 
     HeaderItem header = new HeaderItem(i, MovieList.MOVIE_CATEGORY[i]); 
     mRowsAdapter.add(new ListRow(header, listRowAdapter)); 
    } 

    setAdapter(mRowsAdapter); 
} 

Robię to, bo nie chce, aby pierwsza karta z rzędu dostać wybrany kiedy uruchomić aplikację. Powinien zostać wybrany tylko po naciśnięciu przycisku na Dpad. Jeśli nie mogę tego zrobić w ten sposób, co mam zrobić, aby uzyskać wspomniane zachowanie?

+1

Możesz zażądaćFocus na innym elemencie na ekranie - podobnie jak SearchOrb. Lub dostosuj BackgroundManager, aby nie zawsze wyświetlał obraz w tle. –

Odpowiedz

2

Można setRowViewSelected przez instacji ListRowPresenter i nadrzędnym initializeRowViewHolder(RowPresenter.ViewHolder holder)

@Override 
protected void initializeRowViewHolder(RowPresenter.ViewHolder holder) { 
    super.initializeRowViewHolder(holder); 

    setRowViewSelected(holder, false); 
} 

Ale nie sądzę, możesz odznaczyć wszystkie przedmioty w BrowseFragment użyciu tego podejścia.

Spróbuj ustawić swój ItemViewSelectedListener po wczytaniu danych zamiast ustawienia w onActivityCreated, aby wszystkie pozycje zostały odznaczone przy pierwszym uruchomieniu.

Możliwa przyczyna dlaczego lewy górny element rzędu zawsze będą domyślnie zaznaczona i nie można mieć wszystkie niezaznaczone elementy na pierwszym uruchomieniu:

BrowseFragment „s onItemSelected metodą (line 1372-1382) na pierwszego uruchomienia połączeń mMainFragmentRowsAdapter.getSelectedPosition()

@Override 
    public void onItemSelected(Presenter.ViewHolder itemViewHolder, Object item, 
      RowPresenter.ViewHolder rowViewHolder, Row row) { 
     int position = mMainFragmentRowsAdapter.getSelectedPosition(); //<-- 
     if (DEBUG) Log.v(TAG, "row selected position " + position); 
     onRowSelected(position); 
     if (mExternalOnItemViewSelectedListener != null) { //<-- 
      mExternalOnItemViewSelectedListener.onItemSelected(itemViewHolder, item, 
        rowViewHolder, row); 
     } 
    } 

gdzie getSelectedPosition() zawsze zwraca 0 (line 483-485)

public int getSelectedPosition() { 
     return 0; 
    } 

Zadzwoń również pod numer mExternalOnItemViewSelectedListener.onItemSelected, gdzie mExternalOnItemViewSelectedListener to ItemViewSelectedListener ustawiony w aplikacji MainFragment.

Po pierwszym uruchomieniu, 0 pozycja w 0 rzędzie zostaje wybrana jako domyślnie wybrana pozycja, ale jeśli opóźnisz ustawienie mExternalOnItemViewSelectedListener, to połączenie nie dotrze do wybranego słuchacza wybranego przedmiotu po raz pierwszy.

0

możesz użyć tej metody oddzwaniania.

void onRowViewSelected (RowPresenter.ViewHolder vh, 
        boolean selected) 

Wywoływana, gdy dany widok wiersza zmienia stan zaznaczenia. Podklasa może to zmienić, aby zareagować na wybrane zmiany stanu wiersza. Podklasa może wprowadzać wizualne zmiany do widoku Wiersz, ale nie może tworzyć animacji w widoku Wiersz.

mListRowPresenter.setRowViewSelected(vh, false); 

dlaczego odrzucasz początkowo? Nie dostałem twojego pytania Jasno możesz wyjaśnić, co chcesz zrobić Dokładnie?

+0

Rzecz polega na tym, że po uruchomieniu tej aplikacji domyślnie zostanie wybrany górny lewy rząd wiersza, a jego obraz zostanie wyświetlony. Muszę tylko pokazać inny obraz tła, dopóki użytkownik nie wybierze żadnego elementu karty. – astuter