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,等数据刷新
我要评论