5

Я использую проект по умолчанию для Android TV. Ниже приводится код для создания карт в моем BrowseFragment:Как использовать setRowViewSelected из 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); 
} 

Я делаю это, как я не хочу, чтобы сделать первую карту из строки выбрана, когда я запускаю приложение. Он должен быть выбран только после нажатия кнопки пользователя на Dpad. Если я не могу сделать это таким образом, что мне делать, чтобы получить упомянутое поведение?

+1

Вы можете запроситьфокусировку на другом элементе на экране - например, SearchOrb. Или настройте BackgroundManager, чтобы не всегда показывать изображение на фоне. –

ответ

2

Вы можете setRowViewSelected на подклассы ListRowPresenter и наиважнейшая initializeRowViewHolder(RowPresenter.ViewHolder holder)

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

    setRowViewSelected(holder, false); 
} 

Но я не думаю, что вы можете отменить все пункты в BrowseFragment с использованием этого подхода.

Попробуйте установить ItemViewSelectedListener после загрузки ваших данных вместо того, чтобы устанавливать в onActivityCreated, чтобы все элементы были не выбраны при первоначальном запуске.

Возможная причина почему левый верхний элемент строки всегда будет выбран по умолчанию, и вы не можете иметь все невыбранные пункты первоначального запуска:

BrowseFragment «s onItemSelected метод (line 1372-1382) при первоначальном запуске вызывает 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); 
     } 
    } 

где getSelectedPosition() всегда возвращает 0 (line 483-485)

public int getSelectedPosition() { 
     return 0; 
    } 

Он также называет mExternalOnItemViewSelectedListener.onItemSelected где mExternalOnItemViewSelectedListener является ItemViewSelectedListener, что вы установили в MainFragment вашем приложении.

Таким образом, при первом запуске 0-й элемент в 0-й строке выбирается как выбранный по умолчанию элемент, но если вы задерживаете установку mExternalOnItemViewSelectedListener, этот вызов не достигнет вашего выбранного вами прослушивателя в первый раз.

0

вы можете использовать этот метод обратного вызова.

void onRowViewSelected (RowPresenter.ViewHolder vh, 
        boolean selected) 

Вызывается, когда данный вид строки изменяет состояние выбора. Подкласс может переопределить это для ответа на выбранные изменения состояния строки. Подкласс может создавать визуальные изменения в представлении Row, но не должен создавать анимацию в представлении Row.

mListRowPresenter.setRowViewSelected(vh, false); 

Почему вы не выбираете изначально? я не получил ваш вопрос. Ясно, можете ли вы объяснить, что вы хотите сделать?

+0

Дело в том, что при запуске этого приложения верхний левый элемент строки будет выбран по умолчанию и будет отображаться его фоновое изображение. Что мне нужно сделать, так это то, что мне нужно показать другое фоновое изображение, пока пользователь не выберет какой-либо элемент карты. – astuter