Я приведу пример в Kotlin, я предполагаю, что это то, что вы используете.
Таким образом, вы можете просто переопределить обработку ключей в родительском классе, например:
Создайте метод, который вы вызываете один раз из onCreate, например:
fun keydown_onClick(){
try{
myActivity.setOnKeyListener { _, keyCode, event ->
if (keyCode == android.view.KeyEvent.KEYS_YOU_CARE_ABOUT) {
//handle it
if(activeViewHolder != null){
var displayText = activeViewHolder.yourEditText.text
keyPressedChar = (char)event.getUnicodeChar()+""
//if it's a special key you care about, then handle it in a when statement or if and pass to your adapter if needed to go to next row for example.
displayText += keyPressedChar
activeViewHolder.yourEditText.text = displayText
}
return@setOnKeyListener true//we've processed it
} else
return@setOnKeyListener false// pass on to be processed as normal
}
}catch (ex: Exception){
A35Log.e(mClassTag, "Error handling onkeydown listener: ${ex.message}")
}
}
Далее, как вы справляетесь с этим. ну вы должны следить за активным рядом. Вы можете сделать это, создав обратный вызов в вашей активности, который будет получать уведомления, когда выбирается другая строка или фокусируется.
interface IFocusChangeListener {
fun onNewItemFocused(holder: MyApdaterViewHolder, item: DataItem, index: Int)
}
Это будет передано в ваш адаптер и использовано для возврата к вашему классу активности.
// в деятельности
var activeViewHolder: MyAdapterViewHolder? = null
var activeIndex: Int? = null
var activeItem: DataItem? = null
fun onNewItemFocused(holder: MyAdapterViewHolder, item: DataItem, index: Int){
activeViewHolder = holder
activeIndex = index
activeItem = item
}
// теперь в событии нажатия клавиши вы просто передаете значение в editText в activeViewHolder,
Итак, последняя часть находится в адаптере.
// на bind View
создать видодержатель, обычный наворот.
Затем, когда у вас есть ваш editText, вы просто добавляете.
var item = currentDataItem
var index = currentDataItemIndex
var viewHolder = currentViewHolder //from onBind
viewHolder.setOnFocusChangeListener(object: View.OnFocusChangeListener{
override fun onFocusChange(v: View?, hasFocus: Boolean) {
if(hasFocus){
mFocusListener?.onNewItemFocused(viewHolder, item, index)
}
}
})
// в адаптере вам также может понадобиться
fun onNextEditTextClicked(item: DataItem, index: Int){
//get next data Item by index + 1 if exist and get it's viewholder.editText and set focus to it, this will automatically trigger the focus event back to the activity
}
fun onPreviousEditTextClicked(item: DataItem, index: Int){
//get next data Item by index - 1 if exist and get it's viewholder.editText and set focus to it, this will automatically trigger the focus event back to the activity
}
Теперь у вас есть сфокусированный видоискатель в вызове, вы можете поймать ключи, которые вам нужны, вероятно, все. Вы можете передать их, у вас должно получиться хорошо.
Примечание *
Для справки: если вы используете современные методы, такие как привязка данных, то вы сможете просто обновить привязываемую строку в вашей модели, и она будет отображаться на экране без необходимости передавать ее. Вы также можете привязать фокус к выбранному и просто обновить выбранный логический тип моделей. Есть более чистые способы сделать это, если вы используете связывание. Но пока просто помогаю, не усложняя.
Это решение, возможно, нуждается в доработке, я просто набрал его здесь, так что может быть немного не так, но в основном должно вас туда добраться.
Счастливое кодирование.