如何在RowsFragment中始终显示标题

8

我正在尝试创建一个类似于Youtube应用的Android电视应用程序,并使用Sofa库来实现。现在的问题是,即使RowsFragment没有焦点,我仍然想显示每个项目的标题。以下是将数据集加载到browseFragment的代码:

private void loadRowsCustom() {
        adapter = new ArrayObjectAdapter();

        int split = 3;
        int rowsFragmentCount = videoList.size() / split + (videoList.size() % split != 0 ? 1 : 0);

        for (int i = 0; i < rowsFragmentCount; i++) {

            ListRowPresenter lrp = new ListRowPresenter(FocusHighlight.ZOOM_FACTOR_LARGE);
            ArrayObjectAdapter rowsAdapter = new ArrayObjectAdapter(lrp);

            String category = "Category";

            for (int j = 0; j < split && (i * split + j) < videoList.size(); j++) {
                Video[] videos = videoList.get(i * split + j);
                ArrayObjectAdapter rowCollAdapter = new ArrayObjectAdapter(new VideoPresenter());
                rowCollAdapter.addAll(0, Arrays.asList(videos));
                ListRow row = new ListRow(new HeaderItem(videos[0].category),rowCollAdapter);
                rowsAdapter.add(row);
                category = videos[0].category;
            }

            ArrayObjectAdapter fragmentAdapter = new ArrayObjectAdapter();
            RowsSupportFragment rowsSupportFragment = new RowsSupportFragment();
            rowsSupportFragment.setAdapter(rowsAdapter);
            rowsSupportFragment.enableRowScaling(false);
            fragmentAdapter.add(rowsSupportFragment);
            adapter.add(new ListRow(new HeaderItem(category), fragmentAdapter));
        }

        browseSupportFragment.setAdapter(adapter);
        browseSupportFragment.setHeadersState(BrowseSupportFragment.HEADERS_ENABLED);
        browseSupportFragment.setOnSearchClickedListener(searchClickListener);
        browseSupportFragment.setOnItemViewClickedListener(browseClickListener);
        browseSupportFragment.setTitle("Google Videos");
    }

所需和当前的实现如下截图所示:

enter image description here

enter image description here

2个回答

6
正如Mayur Kaul所提到的,您只需要调用:
mRowsFragment.setExpand(true)

但在这种情况下,每当调用 onAttachedToWindow(...) 方法时(参见 android.support.v17.leanback.app.RowsFragment - ItemBridgeAdapter.AdapterListener mBridgeAdapterListener),您的标题头将始终被隐藏。

因此,最终解决方案是,简单地在您的 RowsFragment 实现中重写 setExpand() 方法,如下所示:

@Override
    public void setExpand(boolean expand) {
        super.setExpand(true);
    }

对于那些像我一样在正确阅读之前就已经感到无聊的人来说,这不仅仅是一个无意义的覆盖,true总是传递给超类的setExpand方法。这应该被标记为正确答案。 - Jarrod Robins

2
对于那些面临类似问题的人们,我终于找到了一个技巧,可以获得所需的结果。但是为此,您可能需要获取BrowseSupportFragment的源代码或在Sofa中进行修改以下行的代码。我知道这有点欺骗性,但它确实能够得到所需的输出结果。
对于BrowseFragment:请注意mRowsFragment.setExpand(true)
private void showHeaders(boolean show) {
        if (DEBUG) Log.v(TAG, "showHeaders " + show);
        mHeadersFragment.setHeadersEnabled(show);
        setHeadersOnScreen(show);
        setRowsAlignedLeft(!show);
        if (mRowsFragment != null) {
            mRowsFragment.setExpand(true);
        } else if (mCurrentFragment != null && mCurrentFragment instanceof RowsFragment) {
            ((RowsFragment) mCurrentFragment).setExpand(true);
        }
    }

同样适用于BrowseSupportFragment

private void showHeaders(boolean show) {
        if (DEBUG) Log.v(TAG, "showHeaders " + show);
        mHeadersSupportFragment.setHeadersEnabled(show);
        setHeadersOnScreen(show);
        setRowsAlignedLeft(!show);
        if (mRowsSupportFragment != null) {
            mRowsSupportFragment.setExpand(true);
        } else if (mCurrentFragment != null && mCurrentFragment instanceof RowsSupportFragment) {
            ((RowsSupportFragment) mCurrentFragment).setExpand(true);
        }
    }

1
你是如何解决这个问题的?能否解释一下,因为我想在我的电视应用程序中做类似的事情。 - Jay Rathod
这在我的情况下不起作用..你可以把你的代码放在Github上吗? - Awais Tariq
由于该方法是包私有的且不可访问,我们该如何使用它? - A_rmas

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