使用PageRow为leanback BrowseFragment自定义标题头

3
该代码由BrowseFragment组成,每个标题行都有多个列表行与之关联。参考此代码,我能够正确地使用PageRow而不是ListRow进行实现。 (https://github.com/googlesamples/leanback-showcase/blob/master/app/src/main/java/android/support/v17/leanback/supportleanbackshowcase/app/page/PageAndListRowFragment.java
问题出在这个函数上,它帮助我自定义标题(向标题添加图标): enter image description here
browseFragment.setHeaderPresenterSelector(new PresenterSelector() {
        @Override
        public IconHeaderPresenter getPresenter(Object item) {
            return new IconHeaderPresenter();
        }

    });

我添加之后,标题不再被选中,我也无法在它们之间导航。

这是我创建的浏览片段:

    ...     
    browseFragment = new BrowseFragment();
    browseFragment.setHeadersState(BrowseFragment.HEADERS_ENABLED);
    browseFragment.prepareEntranceTransition();
    browseFragment.setHeaderPresenterSelector(new PresenterSelector() {
        @Override
        public IconHeaderPresenter getPresenter(Object item) {
            return new IconHeaderPresenter();
        }

    });

    mBackgroundManager = BackgroundManager.getInstance(shared.main);
    mBackgroundManager.attach(shared.main.getWindow());
    browseFragment.getMainFragmentRegistry().registerFragment(IconPageRow.class,
            new PageRowFragmentFactory(mBackgroundManager));

...

private static class PageRowFragmentFactory extends BrowseFragment.FragmentFactory {
    private final BackgroundManager mBackgroundManager;

    PageRowFragmentFactory(BackgroundManager backgroundManager) {
        this.mBackgroundManager = backgroundManager;
    }

    @Override
    public Fragment createFragment(Object rowObj) {
        ArrayObjectAdapter adapter=((IconPageRow)rowObj).getAdapter();
        RowsFragment rowsFragment = new RowsFragment();
        rowsFragment.enableRowScaling(true);
        rowsFragment.setAdapter(adapter);
        mBackgroundManager.setDrawable(null);
        rowsFragment.setOnItemViewClickedListener(browseClickListener);
        rowsFragment.setOnItemViewSelectedListener(browseSelectedListener);
        return rowsFragment;
    }
}
2个回答

4
解决方案是在我的自定义头部演示器(IconHeaderPresenter)的onCreateViewHolder方法中添加以下两行代码:
view.setFocusable(true);
view.setFocusableInTouchMode(true);

我正在开发Android TV的自定义菜单。你能分享一下示例代码吗?@nadine87 - Aravind

2
在IconHeaderPresenter()中。
视图视图 = inflater.inflate(R.layout.icon_header_item, null);
icon_header_item.xml如下:
<android.support.v17.leanback.widget.ImageCardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:backgroundTint="@color/fastlane_background"
    android:clickable="true"
    android:paddingBottom="20dp"
    android:contextClickable="true"
    android:orientation="vertical">
//your layout here
</android.support.v17.leanback.widget.ImageCardView>

我已经为这个问题苦恼了一个月,希望这能对其他人有所帮助。编程愉快 :) - Sid
@shyam002,可以请您发布IconHeaderItemPresenter的代码吗?我想看看ViewHolder是什么样子的。 - Artur A

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接