Я работаю над сеточным интерфейсом (используя VerticalGridSupportFragment
) для Android TV и ищу способ, позволяющий пользователям перемещаться по элементам в сетке.
Идея состоит в том, что сетка содержит несколько телевизионных каналов и что пользователи должны иметь возможность изменять порядок телевизионных каналов (сортировать / переупорядочивать). Мое предлагаемое решение состоит в том, чтобы выбрать канал, щелкая по нему. Канал становится «липким», что позволяет вам перемещать его. Когда вы довольны позицией, вы снова нажимаете на канал, подтверждая его новую позицию.
Очевидное решение - сделать что-то вроде этого:
getVerticalGridView()?.let {
it.setOnChildSelectedListener { _, _, position, _ ->
// Move the item in the previous position to the new position
adapter.move(oldPosition, position)
// Set old position to currently selected position.
oldPosition = position
}
}
fun VerticalGridSupportFragment.getVerticalGridView(): VerticalGridView? {
return VerticalGridSupportFragment::class.java.getDeclaredField("mGridViewHolder")?.let {
it.isAccessible = true
return (it.get(this) as VerticalGridPresenter.ViewHolder).gridView
}
}
Проблема в том, что adapter.move()
вызывает другое дочернее событие.
Я попытался обойти эту проблему, временно удалив прослушиватель выбора и вместо этого оставив ObjectAdapter.DataObserver, чтобы уведомить меня о onItemMoved()
событиях, в которых я устанавливаю выбранную позицию и снова устанавливаю прослушиватель выбора.
Кажется, это тоже не работает полностью.
Невозможно использовать ItemTouchHelper
, так как он был разработан для сенсорных целей и не использовать пульт, как у нас на Android TV.
Официальное приложение для запуска Android TV делает нечто похожее на то, что мне нужно, когда вы меняете ярлыки приложений на домашнем экране, но я не могу придумать, как заставить это работать.