我有RecyclerView
作为其列表项EditText
。当我滚动RecyclerView
时,EditText
会在项目离开屏幕时失去焦点。因此,当焦点在滚动屏幕上显示时,焦点不会保留在EditText
上。
我希望焦点保留在同一个项目上。为此,我还尝试将项目position
存储在焦点上,并将焦点重新分配到onBindViewHolder
。但滚动速度减慢了。
我也尝试使用ListView
,但还有另一种focus
相关问题。焦点跳到那里。
在SO上搜索过这个地段并搜索了很多。但始终找到android:focusableInTouchMode="true"
和android:descendantFocusability="afterDescendants"
等无效的答案。
任何帮助都将受到高度赞赏。
答案 0 :(得分:5)
RecyclerView
的重点是重用视图,这样手机就不必一次将所有行保留在内存中,也不必经常破坏和创建视图。当您的EditText
离开屏幕时,手机将获取该视图,重置其内容并将其移至传入视图堆栈的底部。
这意味着,当您的EditText
离开屏幕后,它就不再存在了。它无法保持焦点,因为它已从布局中删除。
解决这个问题的唯一方法就是你提到的,即存储位置,检查该位置何时出现在屏幕上,以及手动恢复焦点。
答案 1 :(得分:0)
正如 Elan Hamburger 所写,我们应该存储位置并在滚动后屏幕上出现项目时恢复它。
问题是我们不知道该项目何时出现和消失。当我们有多个 ViewHolder
时,甚至无法再次调用 onBindViewHolder
。在这种情况下,我们应该使用 onViewAttachedToWindow
和 onViewDetachedFromWindow
来了解项目何时在屏幕上出现和消失。
private var focusPosition: Int = -1
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
super.onBindViewHolder(holder, position)
// Choose right ViewHolder and set focus event.
holder.edit_text.onFocusChangeListener = View.OnFocusChangeListener { _, hasFocus ->
focusPosition = position
}
}
override fun onViewAttachedToWindow(holder: ViewHolder) {
super.onViewAttachedToWindow(holder)
// Your condition, for instance, compare stored position or item id, or text value.
if (holder.adapterPosition == focusPosition && holder is SomeViewHolder) {
holder.edit_text.requestFocus()
}
}
//override fun onViewDetachedFromWindow(holder: UinBillViewHolder) { //
// super.onViewDetachedFromWindow(holder)
//}
答案 2 :(得分:0)
尝试使用下一个:
LinearSnapHelper snapHelper = new LinearSnapHelper();
snapHelper.attachToRecyclerView(recyclerView);
在垂直方向使用 GridLayoutManager 时它对我有帮助。
此选项会自行稍微滚动列表,以便在滚动时,RecyclerView 中下一个项目的边缘变得可见,因此不会丢失焦点。
但是如果您需要滚动得太快(如果列没有时间加载,并且您需要进一步滚动),这将无济于事。