EditText失去了对RecyclerView中Scroll的关注

时间:2017-07-21 13:29:22

标签: java android listview android-recyclerview setfocus

我有RecyclerView作为其列表项EditText。当我滚动RecyclerView时,EditText会在项目离开屏幕时失去焦点。因此,当焦点在滚动屏幕上显示时,焦点不会保留在EditText上。

我希望焦点保留在同一个项目上。为此,我还尝试将项目position存储在焦点上,并将焦点重新分配到onBindViewHolder。但滚动速度减慢了。

我也尝试使用ListView,但还有另一种focus相关问题。焦点跳到那里。

在SO上搜索过这个地段并搜索了很多。但始终找到android:focusableInTouchMode="true"android:descendantFocusability="afterDescendants"等无效的答案。

任何帮助都将受到高度赞赏。

3 个答案:

答案 0 :(得分:5)

RecyclerView的重点是重用视图,这样手机就不必一次将所有行保留在内存中,也不必经常破坏和创建视图。当您的EditText离开屏幕时,手机将获取该视图,重置其内容并将其移至传入视图堆栈的底部。

RecyclerView diagram

这意味着,当您的EditText离开屏幕后,它就不再存在了。它无法保持焦点,因为它已从布局中删除。

解决这个问题的唯一方法就是你提到的,即存储位置,检查该位置何时出现在屏幕上,以及手动恢复焦点。

答案 1 :(得分:0)

正如 Elan Hamburger 所写,我们应该存储位置并在滚动后屏幕上出现项目时恢复它。

问题是我们不知道该项目何时出现和消失。当我们有多个 ViewHolder 时,甚至无法再次调用 onBindViewHolder。在这种情况下,我们应该使用 onViewAttachedToWindowonViewDetachedFromWindow 来了解项目何时在屏幕上出现和消失。

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 中下一个项目的边缘变得可见,因此不会丢失焦点。

但是如果您需要滚动得太快(如果列没有时间加载,并且您需要进一步滚动),这将无济于事。

我在这里找到了答案Scrolling recyclerview from the middle item