阅读 413

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);但没有起效,不清楚为什么


Dialog

  1. 生命周期
  • 初始化时需要注意

Dialog在第一次调用show()方法后才会执行onCreate(Bundle savedInstanceState)方法,因此建议自定义Dialog时将findViewById等初始化操作放在构造函数中进行,避免外部使用时因在show()之前设置视图数据导致NPE


内存泄漏

  1. 动画

在Activity销毁之前如果没有cancel掉,会导致这个Activity内存泄漏

  1. ClickableSpan

使用SpannableString.setSpan方法设置ClickableSpan可能导致内存泄漏

原因:TextViewonSaveInstanceState时会将ClickableSpan复制一份,由于某些原因,SpannableString不会删除这个ClickableSpan,从而导致内存泄漏,详见: StackOverflow

解决方法:自定义一个抽象类同时继承ClickableSpan和实现NoCopySpan接口,外部setSpan时使用这个抽象类

文章分类
Android
文章标签