焦点乱跳原因
乱跳原因Android原生焦点跳转逻辑设计如此(算是bug吧)。
原生逻辑是根据屏幕显示位置来计算下一个焦点位置,但在切换到屏幕外面时会有问题,比如第2列上移到屏幕为会跳到第3列,第1列下移到屏保外时,会跳到第1列。
解决办法
无效的解决办法:重写 dispatchKeyEvent,如果是在最底部,按键事件派发时,view还没创建。无法解决屏幕外的焦点控制。
有效解决办法:
重写 requestChildFocus 和 dispatchKeyEvent。
package com.android.xxx.view;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import com.android.launcher.BuildConfig;
import com.android.launcher2.data.AppData;
/**
* file description
*
* @author jack
* @note 1. 2022/7/20 create file
**/
public class FocusRecyclerView extends RecyclerView {
private static final String TAG = "FocusRecyclerView";
private View mPrevChild, mPrevFocused;
private int mLastKeyCode;
public FocusRecyclerView(@NonNull Context context) {
super(context);
}
public FocusRecyclerView(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
// setHasFixedSize(true); // no effect
// setItemViewCacheSize(0); // no effect
}
@Override
public void requestChildFocus(View child, View focused) {