AndroidTV - 为 X 行自定义 ListRow。失去焦点

Posted

技术标签:

【中文标题】AndroidTV - 为 X 行自定义 ListRow。失去焦点【英文标题】:AndroidTV - customizing ListRow for X amount of rows. Focus lost 【发布时间】:2019-03-24 07:51:08 【问题描述】:

我在我的 android TV 项目中使用了 Leanback 库。我想自定义 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 行,它就完美了。如果我想显示超过 2 个(所以您在视图中看不到第二个 customListRow)它没有焦点。基本上,如果我有 2+ 行并且我尝试从左到右从下到上移动,则焦点仅在前 2 行上完美。什么可能导致此问题以及如何解决?

想要的输出:

数据:

BIG-OBJ:
    title: "1"
    list-of-small-objs: small1, small2, small3
BIG-OBJ2:
    title: "2"
    list-of-small-objs: small1, small2, small3
...

【问题讨论】:

所以你想在你的行单元格中显示多行内容并且需要自定义单元格对吗?? 我想自定义 ListRow,但由于 Leanback 库的限制,我认为这是不可能的。任何其他解决方案也会很有趣。 你能分享一下你想要什么作为输出的图像吗?因为我在列表和行单元格中做了一些改变。所以可能会帮助你。 你只想要 BIG-OBJ(title 1) 然后一些行。 Title2 又是多行??并以此为重点应该完美地工作?如果我错了,请纠正我。 是的。差不多。 【参考方案1】:

请在 java 中找到我的代码。

这里 ma​​inList 包含标题名称和将添加到特定标题下的数据列表。

在我的场景中,我想要连续 10 个数据,所以对于 jloop,我已经管理了这一点,并且在同一个标​​题下添加了多行。

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));
            
        
    

【讨论】:

以上是关于AndroidTV - 为 X 行自定义 ListRow。失去焦点的主要内容,如果未能解决你的问题,请参考以下文章

python/pytest命令行自定义参数(pytest-fixture装饰器)

Bootstrap 行自定义高度(百分比)

200行自定义异步非阻塞Web框架

200行自定义异步非阻塞Web框架

200行自定义异步非阻塞Web框架

200行自定义异步非阻塞Web框架