在使用smoothScrollToPosition()方法时,如果在滚动过程中调用了notifyDataSetChanged()方法,可能会导致RecyclerView发生闪退。这是因为notifyDataSetChanged()会触发RecyclerView重新绘制,而此时正在进行滚动操作,两者可能会产生冲突。

要规避这个问题,可以在滚动结束后再调用notifyDataSetChanged()方法,可以通过监听RecyclerView的滚动状态来实现。

  1. 创建一个滚动监听器类,实现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;
    }
}
  1. 在创建RecyclerView时,设置滚动监听器。
RecyclerView recyclerView = findViewById(R.id.recyclerView);
ScrollListener scrollListener = new ScrollListener();
recyclerView.addOnScrollListener(scrollListener);
  1. 在调用smoothScrollToPosition()方法之前,先判断当前是否正在滚动,如果正在滚动,则不调用notifyDataSetChanged()方法。
if (!scrollListener.isScrolling()) {
    recyclerView.getAdapter().notifyDataSetChanged();
}
recyclerView.smoothScrollToPosition(position);

通过这种方式,可以避免在滚动过程中调用notifyDataSetChanged()方法导致的闪退问题。

Android RecyclerView 滚动过程中调用 notifyDataSetChanged() 导致闪退的解决方案

原文地址: https://www.cveoy.top/t/topic/quA8 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录