Включить OnKeyListener в ListAdapter - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь включить 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")
    }
}

Не могли бы вы сказать мне, что я скучаю? Заранее спасибо.

...