AndroidTV - настройка ListRow для X строк. Фокус потерян

Я использую библиотеку 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 в представлении), у него нет фокуса. В принципе, если у меня 2+ строки, и я пытаюсь перемещаться слева направо и снизу вверх, фокус отлично работает только на первых 2 строках. Что могло быть причиной этого и как это исправить?

Требуемый результат:

AndroidTV - настройка ListRow для X строк. Фокус потерян

Данные:

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

Итак, вы хотите отображать многострочный контент в своей строке-ячейке, и для этого необходимо настроить ячейку. Правильно ??

Jay Thakkar 23.10.2018 14:57

Я хочу настроить ListRow, но не думаю, что это возможно из-за ограничений библиотеки Leanback. Было бы интересно любое другое решение.

MaartinAndroid 24.10.2018 08:12

Можете ли вы поделиться изображением того, что именно вы хотите в качестве вывода .. потому что я внес некоторые изменения в список и ячейку строки .. Так что могу вам помочь в этом ..

Jay Thakkar 24.10.2018 08:35

Вам просто нужен BIG-OBJ (заголовок 1), а затем несколько строк. Title2 опять несколько строк ?? а с этим фокусом должно работать отлично ??? поправьте меня, если я ошибаюсь.

Jay Thakkar 24.10.2018 09:48

да. Довольно много.

MaartinAndroid 24.10.2018 09:59

Тогда позвольте мне поделиться с вами своим кодом на java, который у меня работает.

Jay Thakkar 24.10.2018 10:44
3
6
1 331
1

Ответы 1

Пожалуйста, найдите мой код в java.

Здесь mainList содержит имя заголовка и список данных, которые будут добавлены под конкретный заголовок.

В моих сценариях я хочу 10 данных в строке, поэтому для петля из j я справился с этим, и несколько строк добавляются под тем же заголовком.

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

Другие вопросы по теме