AndroidTV - 自定义 ListRow 以适应 X 行。焦点丢失

3
我正在使用Leanback库开发我的Android TV项目。我希望能够自定义ListRow,以便我可以更改要显示的内容行数(默认为1)。
我遵循了指南:https://corochann.com/browsefragment-listrow-customization-android-tv-application-hands-on-tutorial-18-705.html
我创建的代码如下:
class CustomListRowPresenter : ListRowPresenter() {

override fun onBindRowViewHolder(holder: RowPresenter.ViewHolder, item: Any) {
    /* This two line codes changes the number of rows of ListRow */
    val numRows = (item as CustomListRow).numRows
    (holder as ListRowPresenter.ViewHolder).gridView.setNumRows(numRows)

    super.onBindRowViewHolder(holder, item)
}

override fun initializeRowViewHolder(holder: RowPresenter.ViewHolder) {
    super.initializeRowViewHolder(holder)

    /* Disable Shadow */
    shadowEnabled = false
}

companion object {
    private val TAG = CustomListRowPresenter::class.java.simpleName
}

}




class CustomListRow : ListRow {
var numRows = 1

constructor(header: HeaderItem, adapter: ObjectAdapter) : super(header, adapter) {}

constructor(id: Long, header: HeaderItem, adapter: ObjectAdapter) : super(id, header, adapter) {}

constructor(adapter: ObjectAdapter) : super(adapter) {}

companion object {

    private val TAG = CustomListRow::class.java.simpleName
}

}

同时:

override onCreate() {
    val adapter = SparseArrayObjectAdapter(CustomListRowPresenter())
    setAdapter(adapter)
}

private fun setContent(content: List<Data>) {
    content.forEachIndexed { index, data ->
        val position = index.toLong()
        val headerItem = HeaderItem(position, data.title)
        val presenterSelector = getMediaObjectPresenterSelector()
        val dataAdapter = ArrayObjectAdapter(presenterSelector)
        val listRow = CustomListRow(position, headerItem, dataAdapter)
        data.content.forEach { x ->
            dataAdapter.add(x)
        }
        listRow.numRows = 5
        dataAdapters.add(dataAdapter)
        adapter.set(position.toInt(), listRow)
    }
    refresh()
}

所以,一切都很好。我得到了想要的行,但有一个问题。例如,如果我想显示两行,那么它可以完美地工作。如果我想显示超过2行(这样您就不会在视图中看到第二个customListRow),它没有焦点。基本上,如果我有两行以上,并且尝试从左到右移动到底部到顶部,焦点仅在前两行上完美工作。这可能是什么原因,如何修复?
期望输出: enter image description here 数据:
BIG-OBJ:
    title: "1"
    list-of-small-objs: small1, small2, small3
BIG-OBJ2:
    title: "2"
    list-of-small-objs: small1, small2, small3
...

所以你想在行单元格中显示多行内容,为此需要自定义单元格,对吧? - Jay Thakkar
我想自定义ListRow,但由于Leanback库的限制,我认为这是不可能的。任何其他解决方案也将是有趣的。 - MaaAn13
你能分享一下你想要的输出图片吗?因为我已经对列表和行单元格进行了一些更改,这可能会对你有所帮助。 - Jay Thakkar
你只需要BIG-OBJ(标题1),然后是一些行。标题2再次有多行??并且以此为重点应该完美地工作??如果我错了,请纠正我。 - Jay Thakkar
是的,基本上是这样。 - MaaAn13
那让我分享一下我的Java代码,它对我来说是可行的。 - Jay Thakkar
1个回答

1
请查看我的Java代码。
这里的mainList包含标题名称和要添加到特定标题下的数据列表。
在我的场景中,我想要每行10个数据,所以用j的for循环来管理,多行添加在同一标题下。
for (int i = 0; i < mainList.size(); i++) {
    ArrayList<HashMap<String,String>> listDataMap = (ArrayList<HashMap<String,String>>) mainList.get(i).get("dataList");

    if(!listDataMap.isEmpty()){
        CardPresenter cardPresenter = new CardPresenter();

        String categoryName = (String) mainList.get(i).get("categoryName");
        ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(cardPresenter);

        List<Movie> list = MovieList.setupGames(listDataMap,i+2);
        for (int j = 1; j <= listDataMap.size(); j++) {
            listRowAdapter.add(list.get(j-1));
            if (j%10 == 0){
                HeaderItem header = new HeaderItem( categoryName);
                mAdapter.add(new ListRow(header, listRowAdapter));
                categoryName = "";
                listRowAdapter = new ArrayObjectAdapter(cardPresenter);
            }else if ( j ==  listDataMap.size() ){
                HeaderItem header = new HeaderItem( categoryName);
                mAdapter.add(new ListRow(header, listRowAdapter));
            }
        }
    }
}

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