我有一个应在平板电脑上运行的应用程序,并且存在一个页面,其中存在一个recyclerview,并且其行项中有2个编辑文本(以numberDecimal作为输入),默认键盘不会出现,因为它覆盖了屏幕的很大一部分。
我在活动中创建了按钮,使其像键盘按钮一样工作,但是问题是如何使活动中的按钮与适配器中的编辑文本进行通信。
我怎么知道,如果我按下(按钮“ 1”),例如它应该在适配器的焦点编辑文本中显示1,以及如果我按下“ <”或“>”按钮,它应该知道前一个和下一个修改文字
请帮助
答案 0 :(得分:0)
- 在单击按钮之前对适配器进行了初始化。因为,需要您的适配器实例才能执行。
- 在适配器中创建方法add()
ArrayList<String> dataList = new ArrayList<>();
public void add(String element) {
dataList.add(element);
notifyItemInserted(dataList.size() - 1);//this will update the recyclerview with data inserted
}
从您的按钮中单击Adapter实例调用此方法
yourAdapter.add(btn1.getText().toString());
答案 1 :(得分:0)
我将在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
}
///现在,在按键事件中,您只需将值传递给activeViewHolder中的editText,
所以最后一块在适配器中。
//在绑定视图上 创建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
}
现在,您在通话活动中拥有了重点突出的查看者,您可以捕获自己想捕获的键,可能是所有键。您可以将它们传递过来,您应该会很好。
注意*
为记录起见,如果您使用的是现代实践(也称为数据绑定),那么您应该能够只更新模型中的可绑定字符串,并且该字符串将显示在屏幕上而无需传递它。您还可以将焦点绑定到选定对象上,然后仅更新模型的选定布尔值。如果使用绑定,则有更清洁的方法来执行此操作。但是现在,只是帮助您而不会使其复杂化。
这个解决方案可能需要调整,我只是在这里输入了它,所以可能有点问题,但是应该可以帮助您解决问题。
快乐编码。