如何解决Android - RecyclerView - edittext notifyItemChanged 保持焦点并继续输入
我有一个 RecyclerView
,它的项目中有一个 EditText
。
对于每个 EditText
,我都添加了一个 textchangelistener
。
每当用户输入一个字符时,我都想做一个输入验证,这样我就可以更改项目,例如在输入错误的情况下显示红色边框等...
在我进行验证后,我调用:
adapter.notifyItemChanged(itemPosition)
更新视图。
但问题是 EditText
失去了焦点,我必须再次在框内单击才能继续输入。
这种情况有解决方案吗?如何在调用 notifyItemChanged
后更新视图时继续输入?
适配器
class ItemAdapter() : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): RecyclerView.ViewHolder {
val inflater = LayoutInflater.from(parent.context)
val binding = LayoutItembinding.inflate(inflater,parent,false)
binding.editText.addTextChangedListener {
// Do layout changes....
if (isInvalidInput) {
item.setError = true
....
...
}
adapter.notifyItemChanged(itemPosition)
}
return ItemViewHolder(binding)
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder,position: Int) {
holder.bind(items[position])
}
inner class ItemViewHolder(val binding: LayoutItembinding)
: RecyclerView.ViewHolder(binding.root) {
fun bind(model: Itemmodel) {
// Setup view for item
}
}
}
解决方法
首先,请发布您的代码。
如果你调用notifyDatasetChanged(),recyclerview的所有视图都会刷新(这意味着可以重新创建视图。)
因此,如果您想在编辑文本中保持焦点,则不要在 notifyDataChanged() 之后调用 notifyDatasetChanged() 或将焦点设置到您的编辑文本。
但是 setFocus 有点困难。 所以我建议在不调用notifyDatasetChanged() 的情况下更新recyclerview 的视图的方法。 我认为您可以直接更新 recyclerview 的视图,而无需调用 notifyDataChanged()。
,尝试在 bind
的 ViewHolder
函数中移动您的错误设置代码并更新 TextWatcher
之外的错误状态:
class ItemAdapter() : RecyclerView.Adapter<RecyclerView.ViewHolder>()
{
override fun onCreateViewHolder(parent: ViewGroup,viewType: Int): RecyclerView.ViewHolder {
val inflater = LayoutInflater.from(parent.context)
val binding = LayoutItemBinding.inflate(inflater,parent,false)
return ItemViewHolder(binding)
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder,position: Int) {
holder.bind(items[position],position)
}
inner class ItemViewHolder(val binding: LayoutItemBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(model: ItemModel,position: Int) {
binding.editText.addTextChangedListener {
// Update the ItemModel on text change
adapter.notifyItemChanged(position)
}
// Update the view error status everytime it is updated
val isInvalidInput = ... // Add your logic
if (isInvalidInput) {
model.setError = true
....
....
}
}
}
}
,
您应该保存包含正在编辑的 EditText 的项目的 id。在 ViewHolder 的 bind() 方法中,您将检查项目当前是否正在编辑,您将在 EditText 上调用 requestFocus() 方法。 请注意,当您调用notifyDataChanged() 时,RecycleView 可能会检查每个项目的数据以了解它是否被更改。如果某个项目的数据发生了变化,RecycleView 会重绘该项目。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。