×

Android 解决RecyclerView焦点跳动 RecyclerView快速滚动焦点丢失问题解决

Android RecyclerView使用notifyItemRangeInserted的如何防止跳动

mtsym mtsym 发表于2019-05-04 16:14:52 浏览11623 评论0

抢沙发发表评论

Android在处理RecyclerView时候,如果使用notifyItemRangeInserted插入数据后可能界面发生跳动,解决这个问题只需要两步

1. 把焦点优先获取权交给RecyclerView,并请求焦点,这样容器先hold住了焦点,便不会乱飞了
2. 数据更新完成后,进行焦点恢复,将焦点优先权交给子元素,然后指定特定的view请求焦点

这个方案能解决大部分焦点乱跳问题,包括快速滚动的

代码大致如下

public void holdFocus() {
    setDescendantFocusability(FOCUS_BEFORE_DESCENDANTS);
    requestFocus();
}

public void resumeFocus(int position) {
    setDescendantFocusability(FOCUS_AFTER_DESCENDANTS);
    if (position > 0 && getLayoutManager() != null) {
        View focusView = getLayoutManager().findViewByPosition(position);
        if (focusView != null)
            focusView.requestFocus();
    }
}

注意

resumeFocus的调用可以适当做一个delay,等数据刷新

群贤毕至

访客