Android开发常见问题总结(持续更新)

滑动

  1. 滑动嵌套

滑动组件的嵌套可能会产生以下一些问题:

  • 滑动冲突

解决方法:使用NestedScrollView替代ScrollViewRecyclerView可以设置属性android:nestedScrollingEnabled="false"或代码里setNestedScrollingEnabled(false);来禁用组件自身的滑动

注意:如果RecyclerView只能显示一个Item的话,需要设置NestedScrollView的属性android:fillViewport="true"

  • 滑动失效

ScrollView设置fillViewport="true"的情况下,如果对ScrollView的直接子view设置上下margin,在超出内容的高度小于设置的margin的情况下,可能会导致整个ScrollView滑动失效

  1. 焦点抢占

ScrollViewRecyclerView等滑动组件可能会抢占焦点,导致界面显示时直接滑动到对应组件的位置,而不是顶部

解决方法:在顶部View(或者其他你所期望的初始位置)加上属性android:focusable="true"android:focusableInTouchMode="true"


RecyclerView

Adapter

  1. onBindViewHolder中设置子View回调时需要注意

如果回调的参数包括position时,需要注意有没有地方会调用notifyItemRemovednotifyItemRangeRemoved,如果有,需要使用holder.getAdapterPosition()来代替onBindViewHolder方法的position参数

原因:notifyItemRemoved不会对其他的Item重新调用onBindViewHolder,这样可能会导致position错位。holder.getAdapterPosition()方法会返回数据在 Adapter 中的位置(即使位置的变化还未刷新到布局中)

  1. 如何在更新数据后重新定位到顶部
//重写父类方法,获得绑定的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);但没有起效,不清楚为什么

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享