Как использовать setRowViewSelected из ListRowPresenter

Я использую проект по умолчанию для Android TV. Ниже приведен код для создания карт в моем BrowseFragment :

 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. Если я не смогу сделать это таким образом, что мне делать, чтобы получить упомянутое поведение?

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

 @Override protected void initializeRowViewHolder(RowPresenter.ViewHolder holder) { super.initializeRowViewHolder(holder); setRowViewSelected(holder, false); } 

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

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

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

BrowseFragment onItemSelected ( строка 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 ( строка 483-485 )

  public int getSelectedPosition() { return 0; } 

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

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

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

  void onRowViewSelected (RowPresenter.ViewHolder vh, boolean selected) 

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

 mListRowPresenter.setRowViewSelected(vh, false); 

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