Я пытаюсь включить OnKeyListener
непосредственно в классе ListAdapter
для прослушивания событий, когда пользователь запрашивает кнопки вверх и вниз на физической клавиатуре. Два других реализованных метода setOnClickListener
и setOnLongClickListener
работают правильно.
Таким образом, нажатие кнопки «вверх» или «вниз» на внешней клавиатуре должно вызвать видимый выбор выбранного элемента recyclerView
- так же, как метод onClick
в настоящее время.
Я следовал этот и этот пост для расширения моего существующего ListAdapter
класса. Я не получаю никаких сообщений об ошибках, я просто слышу сигнал acousti c, исходящий от устройства, когда нажимаю кнопку вверх или вниз, но я не вижу, что происходит что-то вроде выбора элемента, даже Также появляется сообщение Toast
в Actvity
.
Ради ясности я публикую только соответствующие фрагменты кода.
PositionAdapter:
class PositionAdapter(
private val onPositionKey: (id: Int) -> Unit,
private val onPositionClicked: (id: Int) -> Unit,
private val onPositionLongClicked: (position: Position) -> Unit
) : ListAdapter<Position, PositionViewHolder>(object : DiffUtil.ItemCallback<Position>() {
) {
private var mSelected = 0
private lateinit var mRecyclerView: RecyclerView
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = PositionViewHolder(
parent.inflate(R.layout.item_position, false)
).apply {
containerView.apply {
setOnClickListener {
if (adapterPosition != RecyclerView.NO_POSITION) {
onPositionClicked.invoke(getItem(adapterPosition).lfdNr)
mSelected = getItem(adapterPosition).lfdNr
}
}
setOnLongClickListener {
if (adapterPosition != RecyclerView.NO_POSITION) {
onPositionLongClicked.invoke(getItem(adapterPosition))
}
true
}
setOnKeyListener { _, i, keyEvent ->
mRecyclerView = RecyclerView(this.context)
if (adapterPosition != RecyclerView.NO_POSITION) {
onPositionKey.invoke(getItem(adapterPosition).lfdNr)
if (keyEvent.action == KeyEvent.ACTION_DOWN) {
if (i == KeyEvent.KEYCODE_DPAD_DOWN) {
moveSelection(1)
} else if (i == KeyEvent.KEYCODE_DPAD_UP) {
moveSelection(-1)
}
}
}
false
}
}
}
override fun onBindViewHolder(holder: PositionViewHolder, position: Int) =
holder.bind(getItem(position))
override fun getItemCount(): Int = currentList.size
private fun moveSelection(direction: Int): Boolean {
val nextSelectedItem = direction + mSelected
if ((nextSelectedItem >= 0) && (nextSelectedItem < itemCount)) {
notifyItemChanged(mSelected)
mSelected = nextSelectedItem
notifyItemChanged(mSelected)
mRecyclerView.scrollToPosition(mSelected)
return true
}
return false
}
}
PositionViewHolder:
class PositionViewHolder(override val containerView: View) :
RecyclerView.ViewHolder(containerView), LayoutContainer {
private fun select() {
wePosLl.children().forEach {
(it as? TextView)?.let { tv ->
tv.setBackgroundResource(R.drawable.all_borders_dark_blue)
tv.setTextColor(Color.WHITE)
}
}
}
private fun deselect() {
wePosLl.children().forEach {
(it as? TextView)?.let { tv ->
tv.setBackgroundResource(R.drawable.all_borders)
tv.setTextColor(Color.BLACK)
}
}
}
private fun stored() {
wePosLl.children().forEach {
(it as? TextView)?.let { tv ->
tv.setBackgroundResource(R.drawable.all_borders_orange)
tv.setTextColor(Color.BLACK)
}
}
}
}
SupplierActivity :
class SupplierActivity : BaseActivity() {
private val positionAdapter =
PositionAdapter(
{ onPositionKey(it) },
{ onPositionClicked(it) },
{ onPositionLongClicked(it) })
private fun onPositionKey(it: Int) {
showToast("onPositionKey item $it")
}
}
Не могли бы вы сказать мне, что я скучаю? Заранее спасибо.