Android RecyclerView 滚动过程中调用 notifyDataSetChanged() 导致闪退的解决方案
在使用smoothScrollToPosition()方法时,如果在滚动过程中调用了notifyDataSetChanged()方法,可能会导致RecyclerView发生闪退。这是因为notifyDataSetChanged()会触发RecyclerView重新绘制,而此时正在进行滚动操作,两者可能会产生冲突。
要规避这个问题,可以在滚动结束后再调用notifyDataSetChanged()方法,可以通过监听RecyclerView的滚动状态来实现。
- 创建一个滚动监听器类,实现
RecyclerView.OnScrollListener接口。
public class ScrollListener extends RecyclerView.OnScrollListener {
private boolean isScrolling = false;
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
isScrolling = false;
// 滚动结束,调用notifyDataSetChanged()
recyclerView.getAdapter().notifyDataSetChanged();
} else {
isScrolling = true;
} }
public boolean isScrolling() {
return isScrolling;
}
}
- 在创建
RecyclerView时,设置滚动监听器。
RecyclerView recyclerView = findViewById(R.id.recyclerView);
ScrollListener scrollListener = new ScrollListener();
recyclerView.addOnScrollListener(scrollListener);
- 在调用
smoothScrollToPosition()方法之前,先判断当前是否正在滚动,如果正在滚动,则不调用notifyDataSetChanged()方法。
if (!scrollListener.isScrolling()) {
recyclerView.getAdapter().notifyDataSetChanged();
}
recyclerView.smoothScrollToPosition(position);
通过这种方式,可以避免在滚动过程中调用notifyDataSetChanged()方法导致的闪退问题。
原文地址: https://www.cveoy.top/t/topic/quA8 著作权归作者所有。请勿转载和采集!