有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java EditText在RecyclerView中失去了对滚动的关注

我有一个RecyclerView,它的列表项是EditText。当我滚动RecyclerView时,当项目离开屏幕时,EditText会失去焦点。因此,当EditText返回滚动屏幕时,焦点不会停留在EditText

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

我也用ListView试过了,但是还有另一种focus相关的问题。集中注意力

我在网上搜索了很多,在谷歌上搜索了很多。但总是能找到像安卓:focusableInTouchMode="true"安卓:descendantFocusability="afterDescendants"这样不起作用的答案

任何帮助都将不胜感激


共 (2) 个答案

  1. # 1 楼答案

    正如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. # 2 楼答案

    尝试使用下一个:

    LinearSnapHelper snapHelper  = new LinearSnapHelper();
    snapHelper.attachToRecyclerView(recyclerView);
    

    当使用垂直方向的GridLayoutManager时,它帮助了我

    此选项会自行滚动列表,以便在滚动时,可以看到RecyclerView中下一个项目的边缘,从而不会丢失焦点

    但是,如果需要快速滚动(如果该列没有时间加载,并且需要进一步滚动),则这并没有帮助

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