RecyclerView开发中遇到的问题

怼烎@ 2024-03-23 14:40 114阅读 0赞

1.上下滑动时数据显示错乱

分析:

由于RecyclerView的刷新机制,在上下滑动时,会复用之前的item,在某一些item需要展示数据,一些不需要等情况会导致数据错乱

解决:

把不需要显示的地方重置,如隐藏或者置空

2.在RecyclerView嵌套RecyclerView的时候,里面RecyclerView如果使用的是SwipeMenuRecyclerView(带侧滑)在上下滑动的时候会报错

java.lang.IllegalStateException: Cannot set menu creator, setAdapter has already been called.

分析:

监听的方法不能在setadpter之前调用

解决:

在调用之前重置适配器,置为null

3.RecyclerView 设置新的数据源不生效

分析:

更新数据源不生效,那一定是数据源的内存地址变了,数据源一定不能重新设置值,只能更新修改

解决:

保证内存地址不变,notify才能生效

4.BaseMultiItemQuickAdapter不执行convert方法

解决:看是否设置了这些,还要注意recyclerView是否设置了Gone

  1. LinearLayoutManager layoutManager = new LinearLayoutManager(this);
  2. layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
  3. recyclerView.setLayoutManager(layoutManager);

5.在RecyclerView使用ViewPager遇到的问题

1.RecyclerView滚动上去,直至ViewPager看不见,再滚动下来,ViewPager下一次切换没有动画

分析:

Viewpager里有一个私有变量mFirstLayout,它表示是不是第一次显示布局,如果是true,则使用无动画的方式显示当前item,如果是fals,则使用动画方式显示当前item

  1. if (mFirstLayout) {
  2. // We don't have any idea how big we are yet and shouldn't have any pages either.
  3. // Just set things up and let the pending layout handle things.
  4. mCurItem = item;
  5. if (dispatchSelected) {
  6. dispatchOnPageSelected(item);
  7. }
  8. requestLayout();
  9. } else {
  10. populate(item);
  11. scrollToItem(item, smoothScroll, velocity, dispatchSelected);
  12. }

当Viewpager滚动上去后,因为RecyclerView的回收机制,Viewpager会走OnDetachFromWindow,当再次滚动下来时,Viewpager会走OnAttachToWindow,而问题就出现在onAttachToWindow。

  1. @Override
  2. protected void onAttachedToWindow() {
  3. super.onAttachedToWindow();
  4. mFirstLayout = true;
  5. }

解决:

重写onAttachToWindow方法,利用反射将mFirstLayout置为false

  1. @Override
  2. protected void onAttachedToWindow() {
  3. super.onAttachedToWindow();
  4. if (isLayout && getAdapter() != null && getAdapter().getCount() > 0) {
  5. try {
  6. Field mScroller = ViewPager.class.getDeclaredField("mFirstLayout");
  7. mScroller.setAccessible(true);
  8. mScroller.set(this, false);
  9. } catch (Exception e) {
  10. e.printStackTrace();
  11. }
  12. }

2.当ViewPager滚动到一半时,RecyclerView滚动上去,再滚动下来,ViewPager会卡在一半

分析:

问题出在ViewPager源码的onDetachedFromWindow中

  1. @Override
  2. protected void onDetachedFromWindow() {
  3. removeCallbacks(mEndScrollRunnable);
  4. // To be on the safe side, abort the scroller
  5. if ((mScroller != null) && !mScroller.isFinished()) {
  6. mScroller.abortAnimation();
  7. }
  8. super.onDetachedFromWindow();
  9. }

解决:

在自定义ViewPager中重写onDetachedFromWindow方法

  1. @Override
  2. protected void onDetachedFromWindow() {
  3. //fix 使用RecyclerView + ViewPager bug
  4. if (((Activity) getContext()).isFinishing()) {
  5. super.onDetachedFromWindow();
  6. }
  7. }

发表评论

表情:
评论列表 (有 0 条评论,114人围观)

还没有评论,来说两句吧...

相关阅读

    相关 cocos 开发遇到问题

    没有获取到对象 cocos获取节点或者组件时最好加一个判断,判断是否获得到了那个对象,否则可能运行过程中并不会报错,但游戏动不了。 亲身体会!!!,找了好久才发现获取父

    相关 开发遇到问题

    使用spring的单元测试,依赖注入时报空指针(即依赖注入失败) 我在依赖注入上打了断点它也进不去,仔细检查了是不是启动类没有放在相应的包下面,配置类没有加@Configu