Как использовать setRowViewSelected of 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. Если я не могу сделать это таким образом, что я должен сделать, чтобы получить упомянутое поведение?
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
метод ( строка 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);
почему вы сначала отменяете выбор? Я не получил ваш вопрос Ясно, не могли бы вы объяснить, что вы хотите сделать именно??