如何使用ListRowPresenter的setRowViewSelected
How to use setRowViewSelected of ListRowPresenter
我正在使用 Android 电视的默认项目。以下是在我的 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 上的按钮后才会被选中。如果我不能这样做,我应该怎么做才能得到提到的行为?
你可以使用这个回调方法。
void onRowViewSelected (RowPresenter.ViewHolder vh,
boolean selected)
在给定行视图更改选择状态时调用。子类可以覆盖它以响应行的选定状态更改。子类可以对行视图进行视觉更改,但不得在行视图上创建动画。
mListRowPresenter.setRowViewSelected(vh, false);
您最初为什么要取消选择?我没有明白你的问题,你能解释一下你到底想做什么吗??
您可以 setRowViewSelected
通过继承 ListRowPresenter 并覆盖 initializeRowViewHolder(RowPresenter.ViewHolder holder)
@Override
protected void initializeRowViewHolder(RowPresenter.ViewHolder holder) {
super.initializeRowViewHolder(holder);
setRowViewSelected(holder, false);
}
但我认为您无法使用此方法取消选择 BrowseFragment
中的所有项目。
尝试在加载数据后设置 ItemViewSelectedListener
,而不是在 onActivityCreated
中设置,以便在初始启动时取消选择所有项目。
可能的原因为什么默认情况下总是选中行左上角的项目,并且您不能在初始启动时拥有所有未选中的项目:
BrowseFragment
的 onItemSelected
方法 (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);
}
}
其中 getSelectedPosition()
总是 returns 0
(line 483-485)
public int getSelectedPosition() {
return 0;
}
它还会调用 mExternalOnItemViewSelectedListener.onItemSelected
,其中 mExternalOnItemViewSelectedListener
是您在应用的 MainFragment
中设置的 ItemViewSelectedListener。
所以在初始启动时,第 0 行中的第 0 个项目被选为默认选定项目,但如果您延迟设置 mExternalOnItemViewSelectedListener
此调用将不会在第一时间到达您的项目选定侦听器。
我正在使用 Android 电视的默认项目。以下是在我的 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 上的按钮后才会被选中。如果我不能这样做,我应该怎么做才能得到提到的行为?
你可以使用这个回调方法。
void onRowViewSelected (RowPresenter.ViewHolder vh,
boolean selected)
在给定行视图更改选择状态时调用。子类可以覆盖它以响应行的选定状态更改。子类可以对行视图进行视觉更改,但不得在行视图上创建动画。
mListRowPresenter.setRowViewSelected(vh, false);
您最初为什么要取消选择?我没有明白你的问题,你能解释一下你到底想做什么吗??
您可以 setRowViewSelected
通过继承 ListRowPresenter 并覆盖 initializeRowViewHolder(RowPresenter.ViewHolder holder)
@Override
protected void initializeRowViewHolder(RowPresenter.ViewHolder holder) {
super.initializeRowViewHolder(holder);
setRowViewSelected(holder, false);
}
但我认为您无法使用此方法取消选择 BrowseFragment
中的所有项目。
尝试在加载数据后设置 ItemViewSelectedListener
,而不是在 onActivityCreated
中设置,以便在初始启动时取消选择所有项目。
可能的原因为什么默认情况下总是选中行左上角的项目,并且您不能在初始启动时拥有所有未选中的项目:
BrowseFragment
的 onItemSelected
方法 (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);
}
}
其中 getSelectedPosition()
总是 returns 0
(line 483-485)
public int getSelectedPosition() {
return 0;
}
它还会调用 mExternalOnItemViewSelectedListener.onItemSelected
,其中 mExternalOnItemViewSelectedListener
是您在应用的 MainFragment
中设置的 ItemViewSelectedListener。
所以在初始启动时,第 0 行中的第 0 个项目被选为默认选定项目,但如果您延迟设置 mExternalOnItemViewSelectedListener
此调用将不会在第一时间到达您的项目选定侦听器。