滑动
- 滑动嵌套
滑动组件的嵌套可能会产生以下一些问题:
- 滑动冲突
解决方法:使用NestedScrollView
替代ScrollView
,RecyclerView
可以设置属性android:nestedScrollingEnabled="false"
或代码里setNestedScrollingEnabled(false);
来禁用组件自身的滑动
注意:如果RecyclerView
只能显示一个Item的话,需要设置NestedScrollView
的属性android:fillViewport="true"
- 滑动失效
ScrollView
设置fillViewport="true"
的情况下,如果对ScrollView
的直接子view设置上下margin,在超出内容的高度小于设置的margin的情况下,可能会导致整个ScrollView
滑动失效
- 焦点抢占
ScrollView
、RecyclerView
等滑动组件可能会抢占焦点,导致界面显示时直接滑动到对应组件的位置,而不是顶部
解决方法:在顶部View(或者其他你所期望的初始位置)加上属性android:focusable="true"
和android:focusableInTouchMode="true"
RecyclerView
Adapter
- 在
onBindViewHolder
中设置子View回调时需要注意
如果回调的参数包括position时,需要注意有没有地方会调用notifyItemRemoved
或notifyItemRangeRemoved
,如果有,需要使用holder.getAdapterPosition()
来代替onBindViewHolder
方法的position参数
原因:notifyItemRemoved
不会对其他的Item重新调用onBindViewHolder
,这样可能会导致position错位。holder.getAdapterPosition()
方法会返回数据在 Adapter 中的位置(即使位置的变化还未刷新到布局中)
- 如何在更新数据后重新定位到顶部
//重写父类方法,获得绑定的RecyclerView
@Override
public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
mRecyclerView = recyclerView;
}
//当数据更新后调用
if (mRecyclerView != null && mRecyclerView.getChildCount() > 0) {
mRecyclerView.scrollToPosition(0);
}
复制代码
之前尝试过mRecyclerView.scrollTo(0, 0);
但没有起效,不清楚为什么