返回

RecycleView滑动定位失败记

Android

前段时间开的新项目,现在终于开始动工了,我和另一个小伙伴一起做,由于他还在处理另一个项目的尾巴,所以前期只有我一个人来做。之后我也会围绕着这个项目来讲一些我遇到的一些问题,和联想发散的一些问题。

“精品话题”板块,这部分我用 recycleview 做了个横向滑动,然后让女朋友试用…

失败的尝试

本来很顺利,但是后来我女朋友在使用时反馈说,滑动到某一个位置会出现卡顿,然后会直接跳到列表的末尾。

我一开始以为是网络问题,就让她检查了一下网络,确认没问题后,我就开始排查代码。

排查过程

首先我查看了日志,发现并没有任何异常,然后我尝试在模拟器上复现这个问题,但是并没有复现成功。

于是我让她把手机给我,自己亲自试了一下,发现果然在滑动到某一个位置时会出现卡顿,然后直接跳到列表的末尾。

定位问题

我尝试在不同机型上测试,发现只有在她那部手机上会出现这个问题,这让我怀疑是手机的问题。

但是她之前用其他 app 时并没有出现过类似的问题,所以我又排查了一下代码,发现了一个问题:

recyclerView.scrollToPosition(position);

我是在滑动过程中调用了这个方法,导致在滑动过程中如果快速滑动,就会出现跳到列表末尾的问题。

解决方案

我将这个方法改成在滑动结束后调用,问题就解决了。

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);
        if (newState == RecyclerView.SCROLL_STATE_IDLE) {
            int position = recyclerView.getChildAdapterPosition(recyclerView.findChildViewUnder(
                    recyclerView.getWidth() / 2, recyclerView.getHeight() / 2));
            recyclerView.scrollToPosition(position);
        }
    }
});

总结

这次失败的经历让我学到了以下几点:

  • 在开发过程中,一定要注意排查异常和错误,不要放过任何细节。
  • 在使用第三方库时,一定要仔细阅读文档,了解其使用方法和限制。
  • 在设计 UI 时,要考虑用户的使用习惯,避免出现不符合用户预期的操作。
  • 在进行性能优化时,要从多个方面考虑,包括代码优化、网络优化和 UI 优化。

希望这篇文章能给其他 Android 开发者带来一些帮助,也希望大家在开发过程中遇到问题时,不要轻言放弃,要耐心排查,找到问题的根源,并找到合适的解决方案。