5

我正在使用 Android TV 的默认项目。以下是在 my 中创建卡片的代码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 上的按钮后才能选择它。如果我不能这样做,我应该怎么做才能得到提到的行为?

4

2 回答 2

2

您可以setRowViewSelected通过继承 ListRowPresenter 并覆盖initializeRowViewHolder(RowPresenter.ViewHolder holder)

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

    setRowViewSelected(holder, false);
}

但我认为您不能在BrowseFragment使用这种方法时取消选择所有项目。

尝试ItemViewSelectedListener在加载数据后进行设置,而不是设置onActivityCreated为在初始启动时取消选择所有项目。

默认情况下总是选择行的左上角项目并且您不能在初始启动时拥有所有未选择的项目的可能原因:

BrowseFragmentonItemSelected方法(第 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;
    }

它还调用您在应用程序中设置的 ItemViewSelectedListenermExternalOnItemViewSelectedListener.onItemSelected在哪里。mExternalOnItemViewSelectedListenerMainFragment

因此,在初始启动时,第 0 行中的第 0 个项目被选为默认选定项目,但如果您延迟设置,mExternalOnItemViewSelectedListener此调用将不会第一次到达您选择的项目侦听器。

于 2016-11-28T13:57:56.130 回答
0

你可以使用这个回调方法。

   void onRowViewSelected (RowPresenter.ViewHolder vh, 
                    boolean selected)

当给定的行视图更改选择状态时调用。子类可以覆盖它以响应行的选定状态更改。子类可以对 Row 视图进行视觉更改,但不得在 Row 视图上创建动画。

mListRowPresenter.setRowViewSelected(vh, false);

为什么你最初取消选择?我没有清楚地得到你的问题你能解释一下你想做什么吗?

于 2016-11-09T11:59:26.897 回答