RecyclerView项目失去焦点

sNo*_*ore 5 android android-recyclerview linearlayoutmanager

在我的火电视应用我使用的是recyclerviewhorizontal layout.

滚动与dpad工作和项目正在获得关注.

但是,当我按住按钮时,它会非常快速地滚动,因为许多keydown事件被触发,并且项目正在失去焦点而且不可能再滚动,因为Textview我的recyclerview上方的另一个正在获得焦点.

它看起来像一个bug.这有什么解决方法吗?

Håv*_*kke 8

我认为@tmm1 的答案是迄今为止最好的答案。如果用户使用 DPAD 太快而无法滚动,我已经成功地针对在 RecyclerView 中加载的元素失去焦点的问题实施了此解决方法。

在我的 RecyclerView 的适配器中,我使用 LayoutInflater 来像这样膨胀我的元素视图

@Override
public ListItemViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
    View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_keyboard_key, viewGroup, false);
    return new ListItemViewHolder(itemView);
}
Run Code Online (Sandbox Code Playgroud)

我的 item_keyboard_key.xml 最初是这样定义的

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/item_keyboard_key_layout"
    android:orientation="vertical"
    android:gravity="center"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/item_keyboard_key_text"
        android:text="A"/>

</FrameLayout>
Run Code Online (Sandbox Code Playgroud)

然后我创建了一个新的自定义 FrameLayout 类 (FocusFixFrameLayout) 扩展 FrameLayout 并将其用作我的根布局。我的 item_keyboard_key.xml 然后变成了

<?xml version="1.0" encoding="utf-8"?>
<no.bluebit.views.FocusFixFrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/item_keyboard_key_layout"
    android:orientation="vertical"
    android:gravity="center"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/item_keyboard_key_text"
        android:text="A"/>

</no.bluebit.views.FocusFixFrameLayout>
Run Code Online (Sandbox Code Playgroud)

我的 FocusFixFrameLayout 类看起来像这样

public class FocusFixFrameLayout extends FrameLayout {

    public FocusFixFrameLayout(@NonNull Context context) {
        super(context);
    }

    public FocusFixFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public FocusFixFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public FocusFixFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
}

    @Override
    public void clearFocus() {
        if(this.getParent() != null)
            super.clearFocus();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我尝试使用 ConstraintLayout,但它不起作用。在某些时候,回收器视图和整个屏幕完全失去焦点。 (3认同)
  • 这解决了某些设备上的问题,但在其他设备上它仍然存在(例如 API 21 上的 Fire OS 5 设备) (2认同)

Xia*_*zou 5

我面临同样的问题,我在我的项目中所做的事情在我的活动(包含 RecyclerView)中如下所示:

    private long mLastKeyDownTime = 0;
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        long current = System. currentTimeMillis();
        boolean res = false;
        if (current - mLastKeyDownTime < 300 ) {
            res = true;
        } else {
            res = super.onKeyDown(keyCode, event);
            mLastKeyDownTime = current;
        }
        return res;
    }
Run Code Online (Sandbox Code Playgroud)

这避免了当您按住 dpad 上的按钮时快速滚动,并且焦点在我的 RecyclerView 中工作正常。

  • 我在我的项目中对此进行了测试,但它并没有真正起作用。它会减少问题,但问题仍然存在 (2认同)

tmm*_*mm1 5

看起来这是一个错误。

请参阅/sf/answers/2323345951/https://issuetracker.google.com/issues/37067220


我可以通过对clearFocus()项目视图进行绝育来解决此错误,因此失去焦点的分离视图不会将焦点移出 RecyclerView:

override fun clearFocus() {
    if (parent != null)
        super.clearFocus()
}
Run Code Online (Sandbox Code Playgroud)

  • 我使用的是 Kotlin,因此“parent”正在调用“getParent()”。 (2认同)