如何使用ListRowPresenter的setRowViewSelected

时间:2016-11-09 10:42:58

标签: android adapter android-viewholder android-tv 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 个答案:

答案 0 :(得分:2)

您可以通过继承ListRowPresenter并覆盖setRowViewSelected

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

    setRowViewSelected(holder, false);
}

但我不认为您可以使用此方法取消选择BrowseFragment中的所有项目。

尝试在加载数据后设置ItemViewSelectedListener,而不是在onActivityCreated设置,以便在首次启动时取消选中所有项目。

可能的原因为什么默认情况下始终会选择左上行项目,并且您无法在首次启动时拥有所有未选择的项目:

初始启动电话BrowseFragment

{p> onItemSelected的{​​{1}}方法(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); } } 始终返回0 (line 483-485

getSelectedPosition()

它还会调用 public int getSelectedPosition() { return 0; } ,其中mExternalOnItemViewSelectedListener.onItemSelected是您在应用的mExternalOnItemViewSelectedListener中设置的ItemViewSelectedListener。

因此,在首次启动时,第0行中的第0个项目会被选为默认选定项目,但如果您延迟设置MainFragment,则此次调用将无法在第一时间到达您选择的项目。

答案 1 :(得分:0)

您可以使用此回调方法。

   void onRowViewSelected (RowPresenter.ViewHolder vh, 
                    boolean selected)

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

mListRowPresenter.setRowViewSelected(vh, false);

为什么你最初取消选择?我没有得到你的问题显然你可以解释一下你想做什么吗?