请选择 进入手机版 | 继续访问电脑版

解决RecyclerView翻页滚动到不可见Item时焦点乱跑问题

[复制链接]
谭先生 发表于 2021-1-2 17:48:43 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
最近在完善EPG布局的时候,发现了RecyclerView在滚动到下一条不可见的Item换页时,焦点会跑到其他控件上,参考了网上的一些做法,此中一条是重写LayoutManager中的onInterceptFocusSearch函数
  1. //办理滚动过快焦点乱跑问题@Overridepublic View onInterceptFocusSearch(View focused, int direction) {    int count = getItemCount();//获取item的总数    int fromPos = getPosition(focused);//当前焦点的位置    int lastVisibleItemPos = findLastVisibleItemPosition();//最新的已显示的Item的位置    switch (direction) {//根据按键逻辑控制position        case View.FOCUS_DOWN:            if (getOrientation() == RecyclerView.VERTICAL) {                fromPos++;            }            break;        case View.FOCUS_UP:            if (getOrientation() == RecyclerView.VERTICAL) {                fromPos--;            }            break;        case View.FOCUS_RIGHT:            if (getOrientation() == RecyclerView.HORIZONTAL) {                fromPos++;            }            break;        case View.FOCUS_LEFT:            if (getOrientation() == RecyclerView.HORIZONTAL) {                fromPos--;            }            break;    }    if (fromPos >= 0 && fromPos < count) {        //如果下一个位置大于最新的已显示的item,即下一个位置的View没有显示,则滑动到谁人位置,让他显示,就可以获取焦点了        if (fromPos > lastVisibleItemPos) {            scrollToPosition(fromPos);        }    }     return super.onInterceptFocusSearch(focused, direction);}
复制代码
上面的方法在不举行翻页的时候是管用的,但是项目需求是需要举行翻页,而我在Adapter中举行了翻页的判定
  1. itemView.setOnFocusChangeListener(new View.OnFocusChangeListener() {    @Override    public void onFocusChange(View v, boolean hasFocus) {        if (hasFocus) {            int[] amount = getScrollPage(rv, itemView);//盘算需要滑动的间隔            rv.smoothScrollBy(amount[0], amount[1]);            channelLinearLayoutBg.setBackgroundResource(R.drawable.epg_channel_selected);        } else {            channelLinearLayoutBg.setBackgroundResource(R.drawable.epg_channel_unselected);        }    }});private static int[] getScrollPage(RecyclerView recyclerView, View view) {    int[] out = new int[2];    int position = recyclerView.getChildAdapterPosition(view);    int remainder = (position) % 5;    final int parentTop = recyclerView.getPaddingTop();    final int childTop = view.getTop() - view.getScrollY();    int height = view.getHeight();        final int dx = 0;    //同上    int dy = childTop - parentTop - remainder * height;    if (childTop == 5 * height) {        //这里要减去一个Item的高度,原因是onInterceptFocusSearch已经scrollToPosition了一个Item的间隔了        dy -= height;    }    out[1] = dy;    return out;}
复制代码
上面代码的联合,委曲可以大概实现翻页焦点不乱跑,但是偶尔会出现滚动间隔不准确的问题,就是顶部会残留上一页最后一个Item的一部门
综合测试,发现滚动到上一页时,是不会出现残留的现象的,联合代码,我发现了onInterceptFocusSearch只处置惩罚了滚动到下一条的情况,而滚动到上一条不可见未处置惩罚,那么我干脆就去掉onInterceptFocusSearch,然后把getScrollPage函数内里的
  1.     if (childTop == 5 * height) {        //这里要减去一个Item的高度,原因是onInterceptFocusSearch已经scrollToPosition了一个Item的间隔了        dy -= height;    }
复制代码
去掉,测试效果不抱负,在举行翻页的时候,会比力大的概率焦点乱跑,这时候我想到了TextView做无焦点滚动时,需要在其外面加一个LinearLayout的布局,这是为了防止界面其他控件厘革时TextView会重头滚动的现象发生,于是我在RecyclerView的外面也套了一层LinearLayout,果然,测试效果很好,不会有翻页焦点乱跑现象了
  1.    
复制代码
 

来源:https://blog.csdn.net/qq_25017839/article/details/112003091
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题

专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )