Как использовать 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);

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

Другие вопросы по тегам