RecyclerView通过DPAD按键上下切换焦点 切换到界面外的控件时焦点会左右乱跳

焦点乱跳原因

乱跳原因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) {
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值